oracle數(shù)據(jù)庫中Date類型倒入到hive中出現(xiàn) 時分秒截斷問題 解決方案
1.問題描述:
? ? 用sqoop將oracle數(shù)據(jù)表倒入到hive中,oracle中Date型數(shù)據(jù)會出現(xiàn)時分秒截斷問題,只保留了‘yyyy-MM-dd',而不是’yyyy-MM-dd HH24:mi:ss'格式的,后面的‘HH24:mi:ss’被自動截斷了,在對時間要求到秒級的分析處理中這種截斷會產(chǎn)生問題。
2.解決方案:
? ? 在用sqoop倒入數(shù)據(jù)表是,添加--map-column-hive 和--map-column-java參數(shù),來改變數(shù)據(jù)表列的默認映射類型(默認情況下sqoop倒入hive中Date類型會被映射成String),將Date列映射成Timestamp類型,在我的問題中我是通過sqoop創(chuàng)建job,進行數(shù)據(jù)表按時間增量倒入的,PASSTIME列的數(shù)據(jù)類型是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)紅色字體標(biāo)注的兩個參數(shù)用來改變列的映射類型,藍色字體標(biāo)注的是數(shù)據(jù)類型,java.sql.Timestamp要帶包名寫全,否則可能會出錯。
2)--map-column-java和--map-column-hive連個參數(shù)都要顯示給出,如果只給出--map-column-hive那么只會改變hive中表列的數(shù)據(jù)類型,而codegen生成的Tablename.java源文件中還會是java.sql.Date類型,這樣在轉(zhuǎn)換成hive表中的TIMESTAMP類型時,就會出錯導(dǎo)致hive中的PASSTIME字段全部為null。原因可能是由于Date類型默認格式‘yyyy-M-dd',而轉(zhuǎn)化到hive Timestamp類型時,嚴格要求按照’yyyy-mm-dd hh:mm:ss[.f...]'格式轉(zhuǎn)換,參見hive官網(wǎng)timestamp格式說明。
3)如果不設(shè)置--map-column-hive參數(shù),只設(shè)置--map-column-java 為java.sq..Timestamp,也可以實現(xiàn)數(shù)據(jù)精確到時分秒,只不過以string類型保存到列hive中。 事實上,在我實驗后,發(fā)現(xiàn)如果指定--mapcolumn-hive參數(shù)為timestamp,在java中使用對應(yīng)的時間where比較條件時,無法查出數(shù)據(jù),反而,指定--map-column-hive參數(shù)為string,卻能夠在hive中和java代碼中都能夠使用時間列參與查詢。
?
3.參考說明:
sqoop user guide: http://sqoop.apache.org/docs/1.4.5/SqoopUserGuide.html#_selecting_the_data_to_import ?查看map-column-hive和map-column-java參數(shù)說明
hive languageManual: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-timestamp ?查看hive支持的時間類型說明
hive日期函數(shù)
http://athenaxu.blog.163.com/blog/static/2057220392014025332775/
hive數(shù)據(jù)類型轉(zhuǎn)換
http://www.iteblog.com/archives/892
hive開啟行轉(zhuǎn)列功能:
> set hive.cli.print.header=true; // 打印列名
> set hive.cli.print.row.to.vertical=true; // 開啟行轉(zhuǎn)列功能, 前提必須開啟打印列名功能
> set hive.cli.print.row.to.vertical.num=1; // 設(shè)置每行顯示的列數(shù)
> select * from example_table where pt='2012-03-31' limit 2;
hive查看數(shù)據(jù)表結(jié)構(gòu)、列類型
> desc TableName;
sqoop 從oracle導(dǎo)數(shù)據(jù)到hive中,date型數(shù)據(jù)時分秒截斷問題
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯(lián)系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
