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

问题导读
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


  • 3
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值