SerDe Overview

SerDe 是 Serializer/Deserializer 的缩写。 Hive 将 SerDe 接口用于 IO。该接口既处理序列化和反序列化,又将序列化的结果解释为要处理的单个字段。

SerDe 允许 Hive 从表中读取数据,并将其以任何自定义格式写回 HDFS。任何人都可以为自己的数据格式编写自己的 SerDe。

有关 SerDes 的介绍,请参见Hive SerDe

内置和自定义 SerDes

Hive SerDe 库位于 org.apache.hadoop.hive.serde2 中。 (不建议使用 org.apache.hadoop.hive.serde 中的旧 SerDe 库.)

Built-in SerDes

注意:对于 0.12 之前的 Hive 版本,Amazon 提供了位于s3://elasticmapreduce/samples/hive-ads/libs/jsonserde.jar的 JSON SerDe。

Custom SerDes

有关自定义 SerDes 的信息,请参阅Developer Guide中的如何编写自己的 SerDe

HiveQL for SerDes

有关指定 SerDes 及其属性的 HiveQL 语句,请参见Create Table(尤其是行格式和 SerDe)和Alter Table(添加 SerDe 属性)。

Input Processing

对于 UDF,新的 GenericUDF 抽象类在 initialize()方法中提供与 UDF 参数关联的 ObjectInspector。因此,引擎首先通过调用此方法来初始化 UDF。然后,UDF 可以使用这些 ObjectInspector 来解释复杂的参数(对于简单的参数,传递给 udf 的对象已经是正确的原始对象,例如 LongWritable/IntWritable 等)。

Output Processing

输出类似于 Importing。引擎将表示记录的反序列化对象和对应的 ObjectInspector 传递给 Serde.serialize()。在这种情况下,序列化意味着将记录对象转换为 OutputFormat 期望的类型的对象,该对象将用于执行写操作。要执行此转换,serialize()方法可以利用传递的 ObjectInspector 来获取 Logging 的各个字段,以便将记录转换为适当的类型。

Additional Notes

简而言之,Hive 将自动转换对象,以便在需要时将 Integer 转换为 IntWritable(反之亦然)。这允许不具备 Hadoop 知识的人使用 JavaPrimitives 类(Integer 等),而 hadoop 用户/maven 可以使用 IntWritable,后者效率更高。

在 map 和 reduce 之间,Hive 使用 LazyBinarySerDe 和 BinarySortableSerDe 的序列化方法。 SerDe 可以使用 ObjectInspector 序列化由另一个 Serde 创建的对象。

首页