`
xiaobian
  • 浏览: 589072 次
  • 来自: 北京
社区版块
存档分类
最新评论

Hive 中 SerDe 概述

阅读更多

From: http://blog.csdn.net/dajuezhao/archive/2010/07/21/5753791.aspx

一、背景

1、当进程在进行远程通信时,彼此可以发送各种类型的数据,无论是什么类型的数据都会以二进制序列的形式在网络上传送。发送方需要把对象转化为字节序列才可在网络上传输,称为对象序列化;接收方则需要把字节序列恢复为对象,称为对象的反序列化。

2、Hive的反序列化是对key/value反序列化成hive table的每个列的值。

3、Hive可以方便的将数据加载到表中而不需要对数据进行转换,这样在处理海量数据时可以节省大量的时间。

二、技术细节

1、SerDe是Serialize/Deserilize的简称,目的是用于序列化和反序列化。

2、用户在建表时可以用自定义的SerDe或使用Hive自带的SerDe,SerDe能为表指定列,且对列指定相应的数据。

CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name
  [(col_name data_type [COMMENT col_comment], ...)]
  [COMMENT table_comment]
  [PARTITIONED BY (col_name data_type
    [COMMENT col_comment], ...)]
  [CLUSTERED BY (col_name, col_name, ...)
  [SORTED BY (col_name [ASC|DESC], ...)]
  INTO num_buckets BUCKETS]
  [ROW FORMAT row_format]
  [STORED AS file_format]
  [LOCATION hdfs_path]

创建指定SerDe表时,使用row format row_format参数,例如:

a、添加jar包。在hive客户端输入:hive>add jar  /run/serde_test.jar;
或者在linux shell端执行命令:${HIVE_HOME}/bin/hive  -auxpath  /run/serde_test.jar 
b、建表:create table serde_table row format serde  'hive.connect.TestDeserializer';

3、编写序列化类TestDeserializer。实现Deserializer接口的三个函数:

a)初始化:initialize(Configuration conf, Properties tb1)。

b)反序列化Writable类型返回Object:deserialize(Writable blob)。

c)获取deserialize(Writable blob)返回值Object的inspector:getObjectInspector()。

public interface Deserializer {

  /**
   * Initialize the HiveDeserializer.
   * @param conf System properties
   * @param tbl  table properties
   * @throws SerDeException
   */
  public void initialize(Configuration conf, Properties tbl) throws  SerDeException;
  
  /**
   * Deserialize an object out of a Writable blob.
   * In most cases, the return value of this function will be  constant since the function
   * will reuse the returned object.
   * If the client wants to keep a copy of the object, the client  needs to clone the
   * returned value by calling  ObjectInspectorUtils.getStandardObject().
   * @param blob The Writable object containing a serialized object
   * @return A Java object representing the contents in the blob.
   */
  public Object deserialize(Writable blob) throws SerDeException;

  /**
   * Get the object inspector that can be used to navigate through  the internal
   * structure of the Object returned from deserialize(...).
   */
  public ObjectInspector getObjectInspector() throws SerDeException;

}

实现一行数据划分成hive表的time,userid,host,path四个字段的反序列化类。例如:

package hive.connect;

import java.net.MalformedURLException;
import java.net.URL;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hive.serde2.Deserializer;
import org.apache.hadoop.hive.serde2.SerDeException;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import  org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import  org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory.ObjectInspectorOptions;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.io.Writable;

public class TestDeserializer implements Deserializer {
   private static List<String> FieldNames = new ArrayList<String>();
   private static List<ObjectInspector> FieldNamesObjectInspectors =  new ArrayList<ObjectInspector>();
   static {
     FieldNames.add("time");
     FieldNamesObjectInspectors.add(ObjectInspectorFactory
          .getReflectionObjectInspector(Long.class,
               ObjectInspectorOptions.JAVA));
     FieldNames.add("userid");
     FieldNamesObjectInspectors.add(ObjectInspectorFactory
          .getReflectionObjectInspector(Integer.class,
               ObjectInspectorOptions.JAVA));
     FieldNames.add("host");
     FieldNamesObjectInspectors.add(ObjectInspectorFactory
          .getReflectionObjectInspector(String.class,
               ObjectInspectorOptions.JAVA));

     FieldNames.add("path");
     FieldNamesObjectInspectors.add(ObjectInspectorFactory
          .getReflectionObjectInspector(String.class,
               ObjectInspectorOptions.JAVA));

   }

   @Override
   public Object deserialize(Writable blob) {
     try {
        if (blob instanceof Text) {
          String line = ((Text) blob).toString();
          if (line == null)
             return null;
          String[] field = line.split("\t");
          if (field.length != 3) {
             return null;
          }
          List<Object> result = new ArrayList<Object>();
          URL url = new URL(field[2]);
          Long time = Long.valueOf(field[0]);
          Integer userid = Integer.valueOf(field[1]);
          result.add(time);
          result.add(userid);
          result.add(url.getHost());
          result.add(url.getPath());
          return result;
        }
     } catch (MalformedURLException e) {
        e.printStackTrace();
     }
     return null;
   }

   @Override
   public ObjectInspector getObjectInspector() throws SerDeException {
     return ObjectInspectorFactory.getStandardStructObjectInspector(
          FieldNames, FieldNamesObjectInspectors);
   }

   @Override
   public void initialize(Configuration arg0, Properties arg1)
        throws SerDeException {
   }

}

测试HDFS上hive表数据,如下为一条测试数据:

1234567891012 123456 http://wiki.apache.org/hadoop/Hive/LanguageManual/UDF

hive> add jar /run/jar/merg_hua.jar;                                            
Added /run/jar/merg_hua.jar to class path
hive> create table serde_table row format serde 'hive.connect.TestDeserializer';
Found class for hive.connect.TestDeserializer
OK
Time taken: 0.028 seconds
hive> describe serde_table;
OK
time    bigint  from deserializer
userid  int     from deserializer
host    string  from deserializer
path    string  from deserializer
Time taken: 0.042 seconds 
hive> select * from serde_table;
OK
1234567891012   123456  wiki.apache.org /hadoop/Hive/LanguageManual/UDF
Time taken: 0.039 seconds
三、总结

1、创建Hive表使用序列化时,需要自写一个实现Deserializer的类,并且选用create命令的row format参数。

2、在处理海量数据的时候,如果数据的格式与表结构吻合,可以用到Hive的反序列化而不需要对数据进行转换,可以节省大量的时间。

分享到:
评论

相关推荐

    haivvreo:蜂巢+ Avro。 Serde与Hive中的Avro合作

    )是LinkedIn开发的Hive Serde,用于在Hive中处理Avro编码的数据。 Haivvreo的要点: 从Avro模式推断Hive表的模式。 利用Avro的向后兼容功能,根据指定的架构读取表中的所有Avro文件支持任意嵌套的架构。 将所有Avro...

    hive的自定义函数

    #### 二、Hive UDF概述 Hive支持三种类型的自定义函数:用户定义的函数(UDF)、用户定义的聚合函数(UDAF)和用户定义的表生成函数(UDTF)。本篇文章主要介绍UDF的实现方法。 ##### 2.1 UDF的作用 - **扩展性**...

    Hive用户指南 Hive user guide 中文版

    ### Hive用户指南中文版知识点概览 #### 一、Hive结构 **1.1 Hive架构** ...以上是Hive用户指南中文版的主要内容概述,通过对这些知识点的学习和理解,可以帮助用户更好地使用Hive进行大数据处理和分析。

    hive原理1介绍

    #### Hive概述 Hive是一个构建在Hadoop之上的数据仓库工具,它主要解决了Hadoop中数据管理的复杂性问题。通过将结构化的数据文件映射为一张数据库表,Hive提供了SQL查询的功能,使得数据分析人员能够更加方便高效地...

    hive中定义的复杂数据类型导入到es中问题总结.doc

    ROW FORMAT SERDE 'org.elasticsearch.hadoop.hive.EsSerDe' STORED BY 'org.elasticsearch.hadoop.hive.EsStorageHandler' WITH SERDEPROPERTIES ('serialization.format'='1') LOCATION 'hdfs://nameservice1/...

    设计开发 Hive 编程指南 完整版

    1. **Hive 概述**:Hive 是由 Facebook 开发并贡献给 Apache 基金会的一个开源项目,主要用于解决海量半结构化数据的存储和分析问题。它提供了一种在 Hadoop 上进行数据查询、分析和管理的便捷方式,适用于离线...

    hive源码分析

    Hive是Facebook开发的一款数据仓库工具,用于处理存储在Hadoop文件系统中的大量数据集。它通过提供SQL-like语言HiveQL来简化对这些数据的查询过程。本文将深入剖析Hive 0.7.1版本的内部工作原理及其核心组件。 ####...

    hive查询优化

    **架构概述**:Hive的架构主要由三大部分组成——QL(Query Layer)、MetaStore以及Serde(Serializer/Deserializer)。其中: - **QL**:这是Hive的核心组件之一,负责将HiveQL编译成执行计划,即一系列的...

    获取规范货币类型UDF函数.doc

    在Hive中,UDF允许用户扩展Hive的功能,以满足更复杂的数据处理需求。UDF可以用于处理单个值或一列数据,并返回一个处理后的结果。在本案例中,我们将创建一个名为`NormCurrencyType`的UDF,用于将不规范的货币类型...

    第2章 HiveSQL 数据定义语言(DDL)1

    在本章中,我们将深入探讨HiveSQL的数据定义语言(DDL),这是大数据处理领域中一个至关重要的工具。DDL主要用于创建、修改和管理数据库中的结构,包括表、分区、索引等对象。理解并熟练掌握Hive的DDL对于任何在...

    Hive Meta Store E-R图

    #### 二、Hive元数据E-R图概述 Hive元数据E-R图展示了Hive元数据服务中用于存储各种元数据信息的表格及其关系。这些表格包括了数据库、表、分区、索引、权限等实体。通过对这些表格的深入理解,可以更好地了解Hive是...

    hive操作指南

    #### 一、Hive概述及架构 **1.1 Hive架构** Hive架构主要由以下几个部分组成: - **用户接口**:主要包括CLI(命令行界面)、Client(客户端)以及WUI(Web用户界面)。其中CLI是最常用的用户接口,启动时会同时...

    Hive高级编程

    #### 一、Hive概述与组件 Hive 是一个基于 Hadoop 的数据仓库工具,它可以将结构化的数据文件映射为一张数据库表,并提供类 SQL 查询功能,使得 Hadoop 上的数据可以被传统的 BI 工具处理。通过 Hive,用户能够更加...

    Hbase 高可用分布式搭建

    Hive和Impala是两种常用的Hadoop数据查询工具,它们可以通过HBase-SerDe(Serializer/Deserializer)接口与HBase集成,实现对HBase数据的SQL查询。其中,Hive支持更复杂的SQL操作,而Impala提供近实时的分析性能。 ...

    基于Flink+SQL实现数据同步.doc

    2. **Apache Hive**:提供了一种 SQL 接口来处理存储在 Hadoop 文件系统中的大规模数据集。 3. **MongoDB**:是一个跨平台的文档型数据库,适合存储半结构化或非结构化的数据。 4. **Flink SQL**:是 Flink 提供的一...

Global site tag (gtag.js) - Google Analytics