分享

sqoop使用经验总结及问题汇总

nettman 2014-10-22 22:33:19 发表于 总结型 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 11 31551

问题导读
1.导入数据到HDFS,需要注意什么?
2.在测试sqoop语句的时候,如何限制记录数量?
3.sqoop导入时什么情况下会多导入一条数据?






一、sqoop 导入数据到HDFS注意事项

分割符的方向问题
首先sqoop的参数要小心, 从数据库导出数据,写到HDFS的文件中的时候,字段分割符号和行分割符号必须要用

  1. --fields-terminated-by  
复制代码

而不能是
  1. --input-fields-terminated-by  
复制代码

--input前缀的使用于读文件的分割符号,便于解析文件,所以用于从HDFS文件导出到某个数据库的场景。
两个方向不一样。



参数必须用单引号括起来
官方文档的例子是错的:

  1. The octal representation of a UTF-8 character’s code point. This should be of the form \0ooo, where ooo is the octal value. For example, --fields-terminated-by \001 would yield the ^A character.  
复制代码

应该写成
  1. --fields-terminated-by '\001'  
复制代码

创建Hive表
  1. CREATE EXTERNAL TABLE my_table(  
  2.   id int,  
  3. ...  
  4. )  
  5. PARTITIONED BY (  
  6.   dt string)  
  7. ROW FORMAT DELIMITED  
  8.   FIELDS TERMINATED BY '\001'  
  9.   LINES TERMINATED BY '\n'  
  10. STORED AS textfile;  
复制代码

要小心hive的bug,如果用\001, hive会友好的转换成\u0001
但是如果直接写\u0001, hive某些版本会变成u0001



STORED AS textfile 可以不用。





sqoop 使用指定条件导入数据

在测试sqoop语句的时候,一定要限制记录数量,否则就像我刚才,等了1个多小时,才看到测试结果。
  1. sqoop-import --options-file media_options.txt --table my_table --where "ID = 2" --target-dir /user/jenkins/bigdata/import/20140607 -m 1 --fields-terminated-by '\001' --lines-terminated-by '\n'  
复制代码

导入后,可以用hdfs dfs -get命令获取文件到本地目录
然后用bunzip2 命令解压,

最后用emacs的hexl-mode查看文件的16进制格式,检查分割符是否正确。


m 1代表一个mapreduce



sqoop导入时删除string类型字段的特殊字符


如果你指定了\n为sqoop导入的换行符,mysql的某个string字段的值如果包含了\n, 则会导致sqoop导入多出一行记录。

有一个选项

  1. -hive-drop-import-delims     Drops \n, \r, and \01 from string fields when importing to Hive.  
复制代码



sqoop导入数据时间日期类型错误


一个问题困扰了很久,用sqoop import从mysql数据库导入到HDFS中的时候一直报错,最后才发现是一个时间日期类型的非法值导致。

hive只支持timestamp类型,而mysql中的日期类型是datetime, 当datetime的值为0000-00-00 00:00:00的时候,sqoop import成功,但是在hive中执行select语句查询该字段的时候报错。

解决方法是在创建hive表时用string字段类型。







sqoop 从mysql导入hive的字段名称问题

hive中有些关键字限制,因此有些字段名称在mysql中可用,但是到了hive就不行。

比如order必须改成order1, 下面列出了我们发现的一些不能在hive中使用的字段名称

order => order1

sort => sort1

reduce => reduce1

cast => cast1

directory => directory1














加微信w3aboutyun,可拉入技术爱好者群

已有(11)人评论

跳转到指定楼层
anyhuayong 发表于 2014-10-23 08:30:45
沙发,先占位了
回复

使用道具 举报

韩克拉玛寒 发表于 2014-10-23 09:20:32
谢谢分享。
回复

使用道具 举报

hb1984 发表于 2014-10-23 13:38:52
谢谢楼主分享。            
回复

使用道具 举报

wubaozhou 发表于 2015-1-1 20:15:28
回复

使用道具 举报

diandidemeng 发表于 2015-1-31 15:29:43
好资料,谢谢分享。
回复

使用道具 举报

巅峰142斤 发表于 2016-6-8 15:27:25
学习了,谢谢楼主
回复

使用道具 举报

夏洛特猫 发表于 2017-4-13 09:25:36
楼主我想请教下 开源的社区版sqoop可以支持大规模的数据传输吗??例如1GB的数据从mysql传输到hdfs 我这边不知道为什么大于几百兆 传输过程就会报错   谢谢您的回复
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条