Hive表的序列化和反序列化SerDe

SerDe是Serialize/Deserilize的简称,目的是用于序列化和反序列化。
序列化作用
序列化是对象转换为字节序列的过程。 反序列化是字节序列恢复为对象的过程。 对象的序列化主要有两种用途:对象的持久化,
即把对象转换成字节序列后保存到文件中;对象数据的网络传送。 除了上面两点, hive的序列化的作用还包括:Hive的反序列化是对key/value反序列化成hive table的每个列的值。
Hive可以方便的将数据加载到表中而不需要对数据进行转换,这样在处理海量数据时可以节省大量的时间。
SerDe说明hive如何去处理一条记录,包括Serialize/Deserilize两个功能, Serialize把hive使用的java object转换成能写入hdfs的字节序列,或者其他系统能识别的流文件。Deserilize把字符串或者二进制流转换成hive能识别的java object对象。
比如:select语句会用到Serialize对象, 把hdfs数据解析出来;insert语句会使用Deserilize,数据写入hdfs系统,需要把数据序列化。

Hive作为一款构建于Hadoop之上的数据仓库系统,具有良好的异构数据源普遍适用性。Hive内部处理的是记录(Row),任何数据在被Hive处理之前都需要经过Hive的输入接口转成记录(Row)。在Hive中创建表后,Hive在MetaStore中为表存储了必要的元信息,其中有三项元信息用于指定外部数据的输入输出方式。

1)InputFormat。这项元信息是一个实现了Hadoop的数据输入接口(org.apache.hadoop.mapred.InputFormat)的Java类的名称。该实现类将来自外部数据源的数据转换成一系列的Key-Value对,这些Key-Value对的Value部分在后面被Hive用来生成记录。

2)SerDe。这项元信息是一个实 现了Hive中的org.apache.hadoop.hive.serde2.SerDe接口的Java类的名称。Hive从InputFormat获得的各个Key-Value对的Value部分是原始的Writable对象。而由SerDe指定的Java类负责将这些Writable对象转换成可在Hive内部处理的记录(Row),还负责将记录(Row)还原为原始的Writable对象。

3)OutputFormat。这项元信息是一个实现了Hadoop的数据输出接口(org.apache.hadoop.mapred.OutputFormat)的Java类的名称。从记录(Row)还原而来的Writable对象被进一步封装成Key-Value对,然后经过OutputFormat指定的Java类输出到外部数据源。

以上三项信息要么在建表时显式指定,要么由Hive赋缺省值。Hive用来存储记录数据的两种常用文件格式:文本文件和RCFile。

若按文本文件存储,元信息为:

SerDe Library:          org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
InputFormat:            org.apache.hadoop.mapred.TextInputFormat
OutputFormat:           org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat

如果按RCFile存储,元信息为:

SerDe Library:          org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe
InputFormat:            org.apache.hadoop.hive.ql.io.RCFileInputFormat
OutputFormat:           org.apache.hadoop.hive.ql.io.RCFileOutputFormat

创建表的实例:
create external table ods_order_daily
    (order_id int,
    user_id int,
    price int
    )
    comment 'old daily order'
    row format serde
    'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'
    with serdeproperties(
    'field.delim'=',',
    'line.delim'='\n',
    'serialization.format'=',',
    'serialization.encoding'='gbk')
    STORED AS INPUTFORMAT
   'org.apache.hadoop.mapred.TextInputFormat'
    outputformat
   'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
    location
    'hdfs:///user/hive/tmp/order_update';
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值