1. 程式人生 > >oracle資料庫中Date型別倒入到hive中出現時分秒截斷問題解決方案

oracle資料庫中Date型別倒入到hive中出現時分秒截斷問題解決方案

1.問題描述:

    用sqoop將oracle資料表倒入到hive中,oracle中Date型資料會出現時分秒截斷問題,只保留了‘yyyy-MM-dd',而不是’yyyy-MM-dd HH24:mi:ss'格式的,後面的‘HH24:mi:ss’被自動截斷了,在對時間要求到秒級的分析處理中這種截斷會產生問題。

2.解決方案:

    在用sqoop倒入資料表是,新增--map-column-hive 和--map-column-java引數,來改變資料表列的預設對映型別(預設情況下sqoop倒入hive中Date型別會被對映成String),將Date列對映成Timestamp型別,在我的問題中我是通過sqoop建立job,進行資料表按時間增量倒入的,PASSTIME列的資料型別是Date,指令碼如下:

sqoop job --create jobimport2hiveofv_vehicleinfo -- import --hive-import --map-column-java PASSTIME=java.sql.Timestamp --map-column-hive PASSTIME=TIMESTAMP --incremental append --connect jdbc:oracle:thin:@118.228.196.29:1521/pmptgdbanalyze --username SAN --password PASS --verbose -m 1 --bindir /opt/sqoop-1.4
.4/lib --table V_VEHICLEINFO --check-column PASSTIME --last-value '2014-04-20 12:00:00'

注意:

1)紅色字型標註的兩個引數用來改變列的對映型別,藍色字型標註的是資料型別,java.sql.Timestamp要帶包名寫全,否則可能會出錯。

2)--map-column-java和--map-column-hive連個引數都要顯示給出,如果只給出--map-column-hive那麼只會改變hive中表列的資料型別,而codegen生成的Tablename.java原始檔中還會是java.sql.Date型別,這樣在轉換成hive表中的TIMESTAMP型別時,就會出錯導致hive中的PASSTIME欄位全部為null。原因可能是由於Date型別預設格式‘yyyy-M-dd',而轉化到hive Timestamp型別時,嚴格要求按照’yyyy-mm-dd hh:mm:ss[.f...]'格式轉換,參見hive官網timestamp格式說明。

3)如果不設定--map-column-hive引數,只設置--map-column-java 為java.sq..Timestamp,也可以實現資料精確到時分秒,只不過以string型別儲存到列hive中。事實上,在我實驗後,發現如果指定--mapcolumn-hive引數為timestamp,在java中使用對應的時間where比較條件時,無法查出資料,反而,指定--map-column-hive引數為string,卻能夠在hive中和java程式碼中都能夠使用時間列參與查詢。