oracle數據庫中Date類型倒入到hive中出現時分秒截斷問題解決方案html
1.問題描述:java
用sqoop將oracle數據表倒入到hive中,oracle中Date型數據會出現時分秒截斷問題,只保留了‘yyyy-MM-dd',而不是’yyyy-MM-dd HH24:mi:ss'格式的,後面的‘HH24:mi:ss’被自動截斷了,在對時間要求到秒級的分析處理中這種截斷會產生問題。sql
2.解決方案:數據庫
在用sqoop倒入數據表是,添加--map-column-hive 和--map-column-java參數,來改變數據表列的默認映射類型(默認狀況下sqoop倒入hive中Date類型會被映射成String),將Date列映射成Timestamp類型,在個人問題中我是經過sqoop建立job,進行數據表按時間增量倒入的,PASSTIME列的數據類型是Date,腳本以下:apache
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'
注意:oracle
1)紅色字體標註的兩個參數用來改變列的映射類型,藍色字體標註的是數據類型,java.sql.Timestamp要帶包名寫全,不然可能會出錯。app
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格式說明。ide
3)若是不設置--map-column-hive參數,只設置--map-column-java 爲java.sq..Timestamp,也能夠實現數據精確到時分秒,只不過以string類型保存到列hive中。事實上,在我實驗後,發現若是指定--mapcolumn-hive參數爲timestamp,在java中使用對應的時間where比較條件時,沒法查出數據,反而,指定--map-column-hive參數爲string,卻可以在hive中和java代碼中都可以使用時間列參與查詢。函數
3.參考說明:oop
sqoop user guide: http://sqoop.apache.org/docs/1.4.5/SqoopUserGuide.html#_selecting_the_data_to_import 查看map-column-hive和map-column-java參數說明
hive languageManual: https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-timestamp 查看hive支持的時間類型說明
hive日期函數
http://athenaxu.blog.163.com/blog/static/2057220392014025332775/
hive數據類型轉換
http://www.iteblog.com/archives/892
hive開啓行轉列功能:
> set hive.cli.print.header=true; // 打印列名
> set hive.cli.print.row.to.vertical=true; // 開啓行轉列功能, 前提必須開啓打印列名功能
> set hive.cli.print.row.to.vertical.num=1; // 設置每行顯示的列數
> select * from example_table where pt='2012-03-31' limit 2;
hive查看數據表結構、列類型
> desc TableName;