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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM