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';