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

weixin_33860722發表於2018-10-16

如果說前兩者分別是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的解壓縮功能,無縫地對接上了友盟資料平臺的離線日誌。 友盟的小夥伴們從此走上了幸福而快樂的資料分析之路。

相關文章