SerDe 是Serializer 和 Deserializer 的简称。它是 Hive用来处理记录并且将它们映射到 Hive 表中的字段数据类型。为了更好的阐述使用 SerDe 的场景,我们需要了解一下 Hive 是如何读写数据的(类似于 HDFS 中数据的读写操作):
读取数据:
- 从 HDFS 读取数据
- 通过 InputFormat 来处理数据,根据定义的数据类型来将文件分割成键值对记录。在 Hive 中,我们可以通过 Create Table。。。Stored As <File_Format> 来指定使用哪种 InputFormat 来读取数据。
- SerDe 中 JAVA 的 Deserializer 会被调用来格式化数据并且映射到表中对应的字段和数据类型。
对于数据读取,我们希望使用 JSON SerDe 来从 HDFS 中读取文本文件格式数据,并且根据正确的schema将JSON每一行的属性和值与Hive表中的行进行转换。
写入数据:
- 写入的数据(例如 Insert 语句)会通过 SerDe 定义的 Serlializer 类进行转换成 OutputFormat 类能够读取的格式。
- 数据会被OutputFormat 继承类进行处理,创建 RecordWrite 对象。类似于 InputFormat 的实现。OutputFormat 的实现方法跟表写入数据的方式相同。
- 将数据写入到表中(数据将保存在 HDFS)
在实际写入数据的时候,我们可以使用 JSON SerDe来 Hive 表中一个 行列转数据转换成 JSON 文本,保存到 HDFS 中。
接下来我们将详细介绍一下 Hive中常用的 SerDe :
- LazySimpleSerDe:
org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe
,用来处理文本文件格式:TEXTFILE
CREATE TABLE test_serde_lz STORED AS TEXTFILE AS
SELECT name
FRO