sqoop導入數據到hive查詢全部爲null,sqoop導入到hive數據增多的解決方法

  1. sqoop導入數據到hive查詢全部爲null.
    最近在用sqoop導入數據到hive的時候,遇到一個問題.用sqoop將數據導入到hive後,在hive查詢,發現數據全部爲null.
    數據全部爲null
    而用sqoop導入命令的時候,沒有報錯,提示成功
bin/sqoop import --connect jdbc:mysql://xxxxxxxxxxxxx:3306/xxxxxx --username xxxx--password xxxxxxx --table xxxxxxxxxx  --hive-import  --hive-table ods.test1 --hive-overwrite --m 1

sqoop導入成功
在網上查找了原因,發現原因是在於,建hive表是設定的分割符不恰當,跟從postgresql導入過來的數據的分隔符不一樣,所以導致hive切分不了數據,於是查詢爲空,但是這個過程,是不屬於導入失敗的,所以導入命令沒有報錯。

因爲sqoop import實際上是把數據存放到hdfs對應路徑上了,而不是“直接導入表裏”,查詢時,hive會從hdfs的路徑上提取數據,再根據hive表的結構和定義,來向我們展示出類似表格的形式。因此,導入過程是不會報錯的,但是因爲hive定義的分隔符和存在hdfs上數據的分隔符不一致,所以查詢是全爲NULL的。
查看自己hive的建表語句

CREATE TABLE IF NOT EXISTS `ods.test1` (id BIGINT, type_id INT, parent_id INT, name STRING, international_code STRING, gb_code STRING, medical_code STRING, system_code STRING, tree_code STRING, order_id STRING, add_time STRING, note_state INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t' STORED AS TEXTFILE;

可以看到分隔符爲:FIELDS TERMINATED BY '\t',而從postgresql或者mysql來的數據的分隔符則應該爲:FIELDS TERMINATED BY '\u0001',那我們只要改回來就可以正常導入了。
把表刪了,重新建表,指定分隔符爲FIELDS TERMINATED BY '\u0001'.

CREATE TABLE IF NOT EXISTS `ods.test1` (id BIGINT, type_id INT, parent_id INT, name STRING, international_code STRING, gb_code STRING, medical_code STRING, system_code STRING, tree_code STRING, order_id STRING, add_time STRING, note_state INT) ROW FORMAT DELIMITED FIELDS TERMINATED BY '\u0001' STORED AS TEXTFILE;

再重新執行sqoop的導入命令.執行完以後查看果然數據已經能夠展示了
成功展示數據
2. sqoop導入數據到hive數據增多
在一次使用sqoop導入數據到hive,使用的hive自動建表.在查詢的時候發現,hive中的數據比mysql數據庫中多.
在網上查找了以後,發現是分隔符的問題.
導入的數據默認的列分隔符是'\001',默認的行分隔符是'\n'
這樣問題就來了,如果導入的數據中有'\n',hive會認爲一行已經結束,後面的數據被分割成下一行。這種情況下,導入之後hive中數據的行數就比原先數據庫中的多,而且會出現數據不一致的情況。
簡單的解決辦法就是加上參數--hive-drop-import-delims來把導入數據中包含的hive默認的分隔符去掉。

參考 往hive導入查詢數據全爲NULL,但導入過程無報錯,mysql/postgresql
sqoop導出到hive數據增多
sqoop官方文檔

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章