SerDe 是Serializer 和 Deserializer 的简称。它是 Hive用来处理记录并且将它们映射到 Hive 表中的字段数据类型。为了更好的阐述使用 SerDe 的场景,我们需要了解一下 Hive 是如何读写数据的(类似于 HDFS 中数据的读写操作):
读取数据:
写入数据:
接下来我们将详细介绍一下 Hive中常用的 SerDe :
org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe,用来处理文本文件格式:TEXTFILECREATE TABLE test_serde_lz STORED AS TEXTFILE AS
SELECT name
FROM employee;
org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe用来处理 RCFileCREATE TABLE test_serde_cs
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.columnar.ColumnarSerDe'
STORED AS RCFile AS
SELECT name
FROM employee
org.apache.hadoop.hive.ql.io.orc.OrcSerde 用来处理 ORCFileCREATE TABLE test_serde_parquet
STORED AS ORCFILE AS
SELECT name from employee;
org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe用来在 Hive 中读写 Parquet 数据格式的内置 SerDe。从 Hive 0.13.0 版本开始本地支持。CREATE TABLE test_serde_parquet
STORED AS PARQUET AS
SELECT name from employee;
org.openx.data.jsonserde.JsonSerDe这是一个第三方的 SerDe,用来利用 Hive 读取 JSON 数据记录。你可以通知下载源码进行安装(https://github.com/rcongiu/Hive-JSON-Serde)CREATE TABLE test_serde_js(
name string,
sex string,
age string
)
ROW FORMAT SERDE 'org.openx.data.jsonserde.JsonSerDe'
STORED AS TEXTFILE;
org.apache.hadoop.hive.hbase.HBaseSerDe内置的 SerDe,可以让 Hive 跟 HBase 进行集成。我们可以利用 HBaseSerDe 来将 Hive 表存储到 HBase 中。CREATE TABLE test_serde_hb(
id string,
name string,
sex string,
age string
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.hbase.HBaseSerDe'
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping"=":key,info:name,info:sex,info:age")
TBLPROPERTIES("hbase.table.name" = "test_serde");
最后,为了应对目前存在的各式各样的数据格式以及数据存储系统。Hive 允许用户可以自定义 SerDe 来处理自己的文件格式。更多关于 自定义SerDe 请参考: https://cwiki.apache.org/confluence/display/Hive/DeveloperGuide#DeveloperGuide-HowtoWriteYourOwnSerDe .
当然,为了呼应本次主题,特地跑到 Jira 上搜了一些各个 SerDe 的使用情况,随着大家对这些SerDe的深入研究,需求也越来越多,功能也逐渐被完善着:
LazySimpleSerDe :https://issues.apache.org/jira/browse/HIVE-292?jql=text%20~%20%22LazySimpleSerDe%22
ColumnarSerDe : https://issues.apache.org/jira/browse/HIVE-756?jql=text%20~%20%22ColumnarSerDe%22
HBaseSerDe :https://issues.apache.org/jira/browse/HIVE-6677?jql=text%20~%20%22HBaseSerDe%22
ParquetHiveSerDe:https://issues.apache.org/jira/browse/HIVE-9333?jql=text%20~%20%22ParquetHiveSerde%22
JSONSerDe : https://issues.apache.org/jira/browse/HIVE-6166?jql=text%20~%20%22JSONSerDe%22