hive之SerDe
Table of Contents
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" = " ", "quoteChar" = "'", "escapeChar" = "\" ) STORED AS TEXTFILE;
-
ORCSerDe
create table my_table(a string,b string, ...) stored as orc;
- 其他 我们一般不再使用其他的序列化方式。以上几种基本满足日常需求。 MetadataTypedColumnsetSerDe 处理csv类的文件,我们一般使用CSVSserDe.
Created: 2020-05-30 Sat 00:17