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-serde0.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.OrcSerdeRCFILE 的改良版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.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值