一、使用SerDe处理
### --- 使用SerDe处理
~~~ 序列化是对象转换为字节序列的过程;反序列化是字节序列恢复为对象的过程;
~~~ # 对象的序列化主要有两种用途:
~~~ 对象的持久化,即把对象转换成字节序列后保存到文件中
~~~ 对象数据的网络传送
~~~ SerDe 是Serializer 和 Deserializer 的简写形式。
~~~ Hive使用Serde进行行对象的序列与反序列化。
~~~ 最后实现把文件内容映射到 hive 表中的字段数据类型。
~~~ # SerDe包括Serialize/Deserilize 两个功能:
~~~ Serialize把Hive使用的java object转换成能写入HDFS字节序列,或者其他系统能识别的流文件
~~~ Deserilize把字符串或者二进制流转换成Hive能识别的java object对象
~~~ Read : HDFS files => InputFileFormat => <key, value> => Deserializer => Row object
~~~ Write : Row object => Seriallizer => <key, value> => OutputFileFormat => HDFS files
### --- 常见:
https://cwiki.apache.org/confluence/display/Hive/DeveloperGuide#DeveloperGuide-HiveSerDe
二、常见的serde
### --- Hive本身自带了几个内置的SerDe,还有其他一些第三方的SerDe可供选择。
~~~ # 语法:
~~~ 创建表
create table t11(id string)
stored as parquet;
create table t12(id string)
stored as ORC;
~~~ # 操作实例
hive (test)> create table t11(id string)
> stored as parquet;
hive (test)>
> create table t12(id string)
> stored as ORC;
### --- 查看他们使用了什么样的反序列化方式
~~~ # 语法
desc formatted t11;
desc formatted t12;
~~~ LazySimpleSerDe(默认的SerDe)
~~~ ParquetHiveSerDe
~~~ OrcSerde
~~~ # 实例操作
hive (test)> desc formatted t11;
# Storage Information
SerDe Library: org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe
InputFormat: org.apache.hadoop.hive.ql.io.parquet.MapredParquetInputFormat
OutputFormat: org.apache.hadoop.hive.ql.io.parquet.MapredParquetOutputFormat
hive (test)> desc formatted t12;
# Storage Information
SerDe Library: org.apache.hadoop.hive.ql.io.orc.OrcSerde
InputFormat: org.apache.hadoop.hive.ql.io.orc.OrcInputFormat
OutputFormat: org.apache.hadoop.hive.ql.io.orc.OrcOutputFormat
三、纯json格式数据通过JsonSerDe处理
### --- 创建json文件:对于纯 json 格式的数据,可以使用 JsonSerDe 来处理。
[root@hadoop02 ~]# vim /data/yanqidw/logs/data/json2.dat
{"id": 1,"ids": [101,102,103],"total_number": 3}
{"id": 2,"ids": [201,202,203,204],"total_number": 4}
{"id": 3,"ids": [301,302,303,304,305],"total_number": 5}
{"id": 4,"ids": [401,402,403,304],"total_number": 5}
{"id": 5,"ids": [501,502,503],"total_number": 3}
### --- 建表并导入数据
~~~ # 语法
~~~ 建表语句
create table jsont2(
id int,
ids array<string>,
total_number int
)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe';
~~~ 导入数据
load data local inpath '/data/yanqidw/logs/data/json2.dat' into table jsont2;
~~~ # 操作实例
hive (test)> create table jsont2(
> id int,
> ids array<string>,
> total_number int
> )
> ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe';
hive (test)> load data local inpath '/data/yanqidw/logs/data/json2.dat' into table jsont2;
~~~ # 查看创建的表
hive (test)> desc jsont2;
OK
col_name data_type comment
id int from deserializer
ids array<string> from deserializer
total_number int from deserializer
四、各种Json格式处理方法小结:
### --- 各种Json格式处理方法小结:
~~~ 简单格式的json数据,使用get_json_object、json_tuple处理
~~~ 对于嵌套数据类型,可以使用UDF
~~~ 纯json串可使用JsonSerDe处理更简单