所以我就不才把之前记录的资料跟大家分享一下:
SerDe 是Serializer 和 Deserializer 的简称。它是 Hive用来处理记录并且将它们映射到 Hive 表中的字段数据类型。为了更好的阐述使用 SerDe 的场景,我们需要了解一下 Hive 是如何读数据的(类似于 HDFS 中数据的读写操作):
1. 从 HDFS 读取数据
2. 通过 InputFormat 来处理数据,根据定义的数据类型来将文件分割成键值对记录。在 Hive 中,我们可以通过 Create Table。。。Stored As <File_Format> 来指定使用哪种 InputFormat 来读取数据。
3. SerDe 中 JAVA 的 Deserializer 会被调用来格式化数据并且映射到表中对应的字段和数据类型。
对于数据读取,我们希望使用 JSON SerDe 来从 HDFS 中读取文本文件格式数据,并且根据正确的 schema 将 JSON每一行的属性和值与 Hive 表中的行进行转换。
如果写入数据:
1. 写入的数据(例如 Insert 语句)会通过 SerDe 定义的 Serlializer 类进行转换成 OutputFormat 类能够读取的格式。
2. 数据会被OutputFormat 继承类进行处理,创建 RecordWrite 对象。类似于 InputFormat 的实现。OutputFormat 的实现方法跟表写入数据的方式相同。
3. 将数据写入到表中(数据将保存在 HDFS)
在实际写入数据的时候,我们可以使用 JSON SerDe来 Hive 表中一个 行列转数据转换成 JSON 文本,保存到 HDFS 中。
Hive 近期发布的 org.apache.hadoop.hive.serde2 库,之前的的 org.apache.hadoop.hive.serde2 库已经摒弃不建议使用了。接下来我们将详细介绍一下 Hive 中常用的 SerDe :
SerDe 类型
|
具体应用 |
LazySimpleSerDe: 内置SerDe(org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe ) ,用来处理文本文件格式:TEXTFILE |
jdbc:hive2://> CREATE TABLE test_serde_lz . . . . . . .> STORED AS TEXTFILE AS . . . . . . .> SELECT name from employee; No rows affected (32.665 seconds) |
ColumnarSerDe: 用来处理 RCFile 的内置 SerDe | jdbc:hive2://> CREATE TABLE test_serde_cs . . . . . . .> ROW FORMAT SERDE |