在導入時利用如下sqoop1導入
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
但是在導出時使用如下
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"
會經常報錯。
排查后發現由於導入時分割符指定為"\t",部分列中含有字符"\t",導致導出時分割行出現問題。而后續的--hive-drop-import-delims
貌似只能替換hive默認的分隔字符。所以建議導入時使用hive默認的分隔符,並帶上--hive-drop-import-delims
,以避免導出時出現問題。
如下:
導入
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
導出
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:
分隔符 | 描述 |
---|---|
\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 目錄中。
建議
最好使用”\001″作為列分隔符,"\t"在文本中極容易出現,導致導出時錯誤。