hive和impala操作parquet檔案timestamp帶來的困擾
前言:準備使用hive作資料倉庫,因歷史遺留問題,原先遺留的資料處理都是impala處理的,資料檔案是parquet檔案,因本身叢集資源少,而處理的檔案很大,準備使用hive離線分析將小檔案推送到db或者impala進行展示操作。
準備:搭建cdh5.9,將原有的資料從一個叢集遷移到現有的叢集。對資料按照天進行動態分割槽,分割槽資料仍然使用parquet格式。
問題:因分割槽欄位為timestamp型別,一個偶然的機會發現了一個詭異的問題,hive查詢的時間比impala查詢的時間多了8個小時,和原始資料進行比對發現hive處理的timestamp資料有問題。
Based on this discussion
timestamp_millis
type
to the Parquet specification.
Impala's timestamp representation maps to the int96
Parquet
type (4 bytes for the date, 8 bytes for the time, details in the linked discussion).
So no, storing a Hive timestamp in Parquet does not use the timestamp_millis
type,
but Impala's int96
timestamp
representation instead.
以上是查到的問題的原因,因英文不好,不是很難就不在作翻譯了。
說說的我的解決措施吧,因我準備後期長期使用hive 而不是使用impala 固將資料timestamp 新增 to_utc_timestamp(insert_time, 'GMT+8') 進行轉換,函式不懂可以自己去查詢下哈,然後重新分割槽使用orcfile(簡單說下orcfile格式,列式儲存,資料檔案佔用空間小)格式進行儲存。
悲催的是impala不支援orcfile格式的資料檔案,無奈只能選擇妥協方案,大資料檔案使用hive離線處理,資料結果推送到impala或者db,儲存格式為impala支援的格式。
僅以此文紀念為解決此問題死傷的腦細胞!