首页 > 其他 > 详细

利用sqoop导入导出时分隔符问题

时间:2019-08-08 11:28:22      阅读:274      评论:0      收藏:0      [点我收藏+]

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

利用sqoop导入导出时分隔符问题

原文:https://www.cnblogs.com/xfrzrcj/p/11319665.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!