利用sqoop導入導出時分隔符問題

在導入時利用以下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"在文本中極容易出現,致使導出時錯誤。

相關文章
相關標籤/搜索