1. 程式人生 > >SQOOP從mysql匯入資料到hive問題

SQOOP從mysql匯入資料到hive問題

需要將mysql一張表的資料匯入到hive表當中
初始的執行命令如下:

sqoop import --connect jdbc:mysql://10.1.x.x:3306/dbname?characterEncoding=utf-8
--username root 
--password 123456 
--table test
--target-dir /home/hdfs/data/test/insert_time=20180911 
--delete-target-dir 
--fields-terminated-by '|'

執行沒有問題,將表中的所有資料匯入到了hive。注意**- -delete-target-dir引數,如果這個目錄是已經存在而沒有配置這個delete引數,會包路徑已存在的錯誤。現在以

- -query**引數執行sql篩選資料:

sqoop import --connect jdbc:mysql://10.1.x.x:3306/dbname?characterEncoding=utf-8 
--username root 
--password 123456 
--query 'select * from test where Id='86461a32-37bf-42b9' ' 
--target-dir /home/hdfs/data/test/insert_time=20180911 
--delete-target-dir 
--fields-terminated-by '|'

執行出現問題,提示:

When importing query results in parallel, you must specify --split-by.

分析上面的命令,需要引數**- -split-by**,這個引數的意思是,指定一個欄位作為分割槽欄位,比如 id 欄位,數字是0到1000,可能會指定0-100為一個分割槽,啟動一個mapTask進行處理,每100分別啟動一個maptask。可以看出,如果指定的欄位為字串型別,會顯得非常不友好。 但是有另外一個引數可以解決**- -num-mappers 1** ,直接指定maptask數量。
修改命令如下:

sqoop import --connect jdbc:mysql://10.1.x.x:3306/dbname?characterEncoding=utf-8 
--username root 
--password 123456 
--query 'select * from test where Id='86461a32-37bf-42b9' ' 
--num-mappers 1
--target-dir /home/hdfs/data/test/insert_time=20180911 
--delete-target-dir 
--fields-terminated-by '|'

接著報錯:

 ERROR tool.ImportTool: Import failed: java.io.IOException: Query
  [select * from dict_item where dictTypeId=86461a32-37bf-42b9-a3e0-c85b676b2718 ] 
 must contain '$CONDITIONS' in WHERE clause.

可以看到兩個錯誤,一個sql語句中where條件後面的字串沒有單引號,第二個就是query引數必須要的一個引數**$CONDITIONS**,所以,一方面將sql語句的單引號改為雙引號,一方面增加$CONDITIONS引數
修改為:

sqoop import --connect jdbc:mysql://10.1.x.x:3306/dbname?characterEncoding=utf-8 
--username root 
--password 123456 
--query "select * from test where Id='86461a32-37bf-42b9' and  $CONDITIONS "
--num-mappers 1
--target-dir /home/hdfs/data/test/insert_time=20180911 
--delete-target-dir 
--fields-terminated-by '|'

此時還有一個問題

ERROR tool.ImportTool: Import failed: java.io.IOException: Query 
[select * from dict_item where dictTypeId='86461a32-37bf-42b9-a3e0-c85b676b2718' and   ] 
must contain '$CONDITIONS' in WHERE clause.

可以看到錯誤資訊中sql語句where後面的conditions變數不見了,說明雙引號中需要轉義,加一個反斜槓
一般來說是不用加的,加了反斜槓反而會報錯,但是需要根據解析出來的sql進行決策,最開始嘗試建議不加

sqoop import --connect jdbc:mysql://10.x.x.x:3306/dbname?characterEncoding=utf-8 
--username root 
--password 123456 
--query "select * from test where Id='86461a32-37bf-42b9' and  \$CONDITIONS "  
--num-mappers 1 
--target-dir /home/hdfs/data/dict_item/insert_time=20180911 
--delete-target-dir 
--fields-terminated-by '|'

綜上記錄使用sqoop import過程中相關的問題。import命令引數舉例如下:

bin/sqoop import \
--connect jdbc:mysql://172.16.71.27:3306/babasport \
--username root \
--password root \
--query 'select id, brand_id,name from bbs_product  where $CONDITIONS LIMIT 100' \
--target-dir /user/xuyou/sqoop/imp_bbs_product_sannpy_ \
--delete-target-dir \
--num-mappers 1 \
--compress \
--compression-codec org.apache.hadoop.io.compress.SnappyCodec \
--direct \
--fields-terminated-by '\t'