Hive的序列化/反序列化(SerDe)

如果说前两者分别是Hive模式设计的沙漠飞鹰和AK47,那么SerDe就是巡航导弹。
下面我们来看一下SerDe是什么。

SerDe是序列化/反序列化的简写形式,其作用是将一条非结构化字节转化成Hive可以使用的一条记录。Hive本身自带了几个内置的SerDe,而一些第三方的SerDe也十分常用。

我们举例介绍一下常见SerDe:
RegexSerDe
CSVSerde/TSVSerde
JsonSerde
AvroSerDe
LazySimpleSerDe
......
以JsonSerde为例,

#

本例中,/data/messages文件为Json格式。JsonSerde读取messages中的每一条记录,并解析成Json Object,在代码中以$表示。类似"msg_id"="$.id"这样的操作语句,表示获取$["id"]的数据内容并转化成messages中的msg_id。
一旦定义好之后,用户就不再需要关心如何读取解析Json数据,可以像操作数据库数据一样操作Json数据。serdeproperties是Hive提供给SerDe的一个功能,Hive并不关心这些配置属性是什么。在读取文件记录的时候,SerDe读取相应的配置信息来完成解析工作。也就是说,serdeproperties其实是SerDe的配置界面,一种SerDe拥有一种配置信息格式,而不同SerDe之间的serdeproperties配置信息并没有任何关联。下图为SerDe的工作原理,

Hive的SerDe着实是一项重磅武器。对于绝对大多数常用的数据格式,Hive官方或者第三方都提供了相应的SerDe。如果有公司和团队剑走偏锋,采用一些“非凡”的数据格式,仍然可以自定义SerDe。
例如,友盟的移动APP日志数据就采用Google Protobuf格式,并选用高压缩比的lzma/lzo作为压缩算法,而Hive原生态组件中并不支持解析这样的数据格式。如果将Protobuf+lzo的数据转化成文本或者Json以方便Hive读取,又将面临大量的数据冗余。友盟数据仓库搭建采用了Twitter开源项目ElephantBird提供的“ProtobufDeserializer”,又在此基础上实现了对lzo/lzma的解压缩功能,无缝地对接上了友盟数据平台的离线日志。 友盟的小伙伴们从此走上了幸福而快乐的数据分析之路。

你可能感兴趣的:(Hive的序列化/反序列化(SerDe))