hive之SerDe

hive之SerDe

1 什么是SerDe

SerDe 是两个单词的拼写 serialized(序列化) 和 deserialized(反序列化)。 什么是序列化和反序列化呢?

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

Hive的反序列化是对key/value反序列化成hive table的每个列的值。Hive可以方便 的将数据加载到表中而不需要对数据进行转换,这样在处理海量数据时可以节省大量的时间。

在读写行数据时,流程如下:

- 读
HDFS files --> InputFileFormat --> <key, value> --> Deserializer --> Row object
- 写
Row object --> Serializer --> <key, value> --> OutputFileFormat --> HDFS files

当向hdfs写数据的时候,先经过序列化,将数据转化成字节序列,然后以指定的格式(outputformat) 输出到hdfs. 而从hdfs读数据时,则是一个相反的过程。

2 序列化方式

hive 中内置了多种序列化方式。同时也支持自定义。这里只说明几种内置的序列化方式:

对于JSON文件,在Hive 0.12.0中添加了JsonSerDe。Amazon SerDe可以在s3://elasticmapreduce/samples/hive-ads/libs/jsonserde.jar中获得,用于0.12.0之前的版本。 在Hive 0.9.1中添加了Avro SerDe。 从Hive 0.14.0开始,其规范隐含在STORED AS AVRO子句中。 在Hive 0.11.0中添加了ORC文件格式的SerDe。 Parive的SerDe通过Hive 0.10中的插件添加,并在Hive 0.13.0中原生添加。 在Hive 0.14中添加了支持 CSV 的SerDe。

SerDe 类型是否内说明支持版本
LazySimpleSerDe 内置 org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe 用来处理文本文件格式:TEXTFILE ,默认的处理方式。  
ColumnarSerDe 内置 org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe 处理RCFile  
RegexSerDe 内置 org.apache.hadoop.hive.serde2.RegexSerDe 用来处理文本文件的内置 JAVA 正则表达式 SerDe  
HBaseSerDe 内置   允许 Hive 跟 HBase 进行集成。我们可以利用 HBaseSerDe 来将 Hive 表存储到 HBase 中  
AvroSerDe 内置   在 Hive 表中读写 Avro 数据格式的数据。 0.9.1
      参考http://avro.apache.org/  
ParquetHiveSerDe 内置 org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe 在 Hive 中读写 Parquet 数据格式的数据 0.13
OpenCSVSerDe 内置 org.apache.hadoop.hive.serde2.OpenCSVSerde 读写CSV数据,源码:https://github.com/ogrodnek/csv-serde 0.14
JSONSerDe 内置 org.apache.hadoop.hive.serde2.JsonSerDe 可以通过Hive 读取 JSON 数据 3.0.0
    不需要指定库,CREATE TABLE my_table(…) STORED AS JSONFILE;   4.0.0
    org.apache.hive.hcatalog.data.JsonSerDe 可以通过Hive 读取 JSON 数据 0.12 later
ORC 内置 org.apache.hadoop.hive.ql.io.orc.OrcSerde RCFILE 的改良版 O.11
thrift 内置      
MultiDelimitSerDe 内置 org.apache.hadoop.hive.contrib.serde2.MultiDelimitSerDe 处理多种分隔符的textfile.  

3 序列化的使用

 

3.1 建表时指定序列化方式

  • RegexSerDe

      CREATE TABLE apachelog (
      host STRING,
      identity STRING,
      user STRING,
      time STRING,
      request STRING,
      status STRING,
      size STRING,
      referer STRING,
      agent STRING)
    ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.RegexSerDe'
    WITH SERDEPROPERTIES (
      "input.regex" = "([^]*) ([^]*) ([^]*) (-|\\[^\\]*\\]) ([^ \"]*|\"[^\"]*\") (-|[0-9]*) (-|[0-9]*)(?: ([^ \"]*|\".*\") ([^ \"]*|\".*\"))?"
    )
    STORED AS TEXTFILE;
    
  • JsonSerDe

    ADD JAR /usr/lib/hive-hcatalog/lib/hive-hcatalog-core.jar;
    
    CREATE TABLE my_table(a string, b bigint, ...)
    ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
    STORED AS TEXTFILE;
    
  • CSVSerDe

    CREATE TABLE my_table(a string, b string, ...)
    ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
    WITH SERDEPROPERTIES (
       "separatorChar" = "\t",
       "quoteChar"     = "'",
       "escapeChar"    = "\\"
    )
    STORED AS TEXTFILE;
    
  • ORCSerDe

    create table my_table(a string,b string, ...) stored as orc;
    
  • 其他 我们一般不再使用其他的序列化方式。以上几种基本满足日常需求。 MetadataTypedColumnsetSerDe 处理csv类的文件,我们一般使用CSVSserDe.

Author: halberd.lee

Created: 2020-05-30 Sat 00:17

Validate

posted @ 2020-05-30 00:18  halberd.lee  阅读(2787)  评论(0编辑  收藏  举报