sqoop使用经验总结及问题汇总
问题导读
1.导入数据到HDFS,需要注意什么?
2.在测试sqoop语句的时候,如何限制记录数量?
3.sqoop导入时什么情况下会多导入一条数据?
static/image/hrline/4.gif
一、sqoop 导入数据到HDFS注意事项
分割符的方向问题
首先sqoop的参数要小心, 从数据库导出数据,写到HDFS的文件中的时候,字段分割符号和行分割符号必须要用
--fields-terminated-by
而不能是
--input-fields-terminated-by
--input前缀的使用于读文件的分割符号,便于解析文件,所以用于从HDFS文件导出到某个数据库的场景。
两个方向不一样。
参数必须用单引号括起来
官方文档的例子是错的:
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.
应该写成
--fields-terminated-by '\001'
创建Hive表
CREATE EXTERNAL TABLE my_table(
id int,
...
)
PARTITIONED BY (
dt string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\001'
LINES TERMINATED BY '\n'
STORED AS textfile;
要小心hive的bug,如果用\001, hive会友好的转换成\u0001
但是如果直接写\u0001, hive某些版本会变成u0001
STORED AS textfile 可以不用。
static/image/hrline/2.gif
sqoop 使用指定条件导入数据
在测试sqoop语句的时候,一定要限制记录数量,否则就像我刚才,等了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
static/image/hrline/2.gif
sqoop导入时删除string类型字段的特殊字符
如果你指定了\n为sqoop导入的换行符,mysql的某个string字段的值如果包含了\n, 则会导致sqoop导入多出一行记录。
有一个选项
-hive-drop-import-delims Drops \n, \r, and \01 from string fields when importing to Hive.
static/image/hrline/2.gif
sqoop导入数据时间日期类型错误
一个问题困扰了很久,用sqoop import从mysql数据库导入到HDFS中的时候一直报错,最后才发现是一个时间日期类型的非法值导致。
hive只支持timestamp类型,而mysql中的日期类型是datetime, 当datetime的值为0000-00-00 00:00:00的时候,sqoop import成功,但是在hive中执行select语句查询该字段的时候报错。
解决方法是在创建hive表时用string字段类型。
static/image/hrline/2.gif
sqoop 从mysql导入hive的字段名称问题
hive中有些关键字限制,因此有些字段名称在mysql中可用,但是到了hive就不行。
比如order必须改成order1, 下面列出了我们发现的一些不能在hive中使用的字段名称
order => order1
sort => sort1
reduce => reduce1
cast => cast1
directory => directory1
沙发,先占位了 谢谢分享。 感谢分享。 谢谢楼主分享。 {:soso_e181:} 好资料,谢谢分享。
谢谢分享! 学习了,谢谢楼主 楼主我想请教下 开源的社区版sqoop可以支持大规模的数据传输吗??例如1GB的数据从mysql传输到hdfs 我这边不知道为什么大于几百兆 传输过程就会报错 谢谢您的回复
页:
[1]
2