在導入時利用以下sqoop1導入mysql
sqoop import --connect jdbc:oracle:thin:@ip:port/ORCL --username user --password pwd --table db.table --target-dir /path --delete-target-dir -m 1 --null-string "\\N" --null-non-string "\\N" --as-textfile --fields-terminated-by "\t" --hive-drop-import-delims
可是在導出時使用以下sql
sqoop export --connect jdbc:mysql://ip:3306/db?characterEncoding=utf8 --username user --password pwd --table table --export-dir /path* --update-mode allowinsert --update-key id --input-null-string "\\N" --input-null-non-string "\\N" --fields-terminated-by "\t"
會常常報錯。shell
排查後發現因爲導入時分割符指定爲"\t",部分列中含有字符"\t",致使導出時分割行出現問題。然後續的--hive-drop-import-delims
貌似只能替換hive默認的分隔字符。因此建議導入時使用hive默認的分隔符,並帶上--hive-drop-import-delims
,以免導出時出現問題。oracle
以下:oop
導入編碼
sqoop import --connect jdbc:oracle:thin:@ip:port/ORCL --username user --password pwd --table db.table --target-dir /path --delete-target-dir -m 1 --null-string "\\N" --null-non-string "\\N" --as-textfile --fields-terminated-by "\001" --hive-drop-import-delims
導出code
sqoop export --connect jdbc:mysql://ip:3306/db?characterEncoding=utf8 --username user --password pwd --table table --export-dir /path* --update-mode allowinsert --update-key id --input-null-string "\\N" --input-null-non-string "\\N" --fields-terminated-by "\001"
NOTE:ip
分隔符 | 描述 |
---|---|
\n | 對於文本文件來講,每行都是一條記錄,所以換行符能夠分隔記錄 |
^A(ctl+A) | 用於分隔字段(列)。在CREATE TABLE語句中能夠使用八進制編碼\001表示 |
^B(ctl+B) | 用於分隔ARRAY或者STRUCT中的元素,或用於MAP中鍵-值對之間的分隔。在CREATE TABLE語句中能夠使用八進制編碼\002表示 |
^C(ctl+C) | 用於MAP中鍵和值之間的分隔。在CREATE TABLE語句中能夠使用八進制編碼\003表示 |
Hive 中沒有定義專門的數據格式,數據格式能夠由用戶指定,用戶定義數據格式須要指定三個屬性:列分隔符(一般爲空格、」\t」、」\001″)、行分隔符(」\n」)以及讀取文件數據的方法。因爲在加載數據的過程當中,不須要從用戶數據格式到 Hive 定義的數據格式的轉換,所以,Hive 在加載的過程當中不會對數據自己進行任何修改,而只是將數據內容複製或者移動到相應的 HDFS 目錄中。get
建議input
最好使用」\001″做爲列分隔符,"\t"在文本中極容易出現,致使導出時錯誤。