在导入时利用以下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"在文本中极容易出现,致使导出时错误。