sqoop使用注意事项

**概念:**Sqoop是一个用来将Hadoop和关系型数据库中的数据相互转移的工具,可以将一个关系型数据库(例如 : MySQL ,Oracle ,Postgres等)中的数据导进到Hadoop的HDFS中,也可以将HDFS的数据导进到关系型数据库中。
使用注意事项:
尽管有以上的优点,在使用Sqoop的时候还有一些事情需要注意。首先,对于默认的并行机制要小心。默认情况下的并行意味着Sqoop假设大数据是在分区键范围内均匀分布的。这在当你的源系统是使用一个序列号发生器来生成主键的时候工作得很好。打个比方,当你有一个10个节点的集群,那么工作负载是在这10台服务器上平均分配的。但是,如果你的分割键是基于字母数字的,拥有比如以“A”作为开头的键值的数量会是“M”作为开头键值数量的20倍,那么工作负载就会变成从一台服务器倾斜到另一台服务器上。

sqoop 导入数据到HDFS注意事项

分割符的方向问题
首先sqoop的参数要小心, 从数据库导出数据,写到HDFS的文件中的时候,字段分割符号和行分割符号必须要用--fields-terminated-by而不能使用--input-fields-terminated-by
–input前缀的使用于读文件的分割符号,便于解析文件,所以用于从HDFS文件导出到某个数据库的场景。两个方向不一样。

  • 参数必须用单引号括起来官方文档的例子是错的:
 --fields-terminated-by \001

应写成

--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

sqoop 使用指定条件导入数据

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导入多出一行记录。
有一个选项

-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

sqoop导入导出hive,mysql 出现的问题
1.从mysql导入到Hive 出现数据带入错误:当字段中存在输入tab键,会被hive识别多创建一条字段。

解决:sqoop import 语句中 添加 --hive-drop-import-delims 来把导入数据中包含的hive默认的分隔符去掉。

2.出现PRIMARY主键错误:com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry ‘1’ for key ‘PRIMARY’

解决:目标表中数据没有清除,清除后倒入成功(表的主键)

3.com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column ‘rep_status’ at row 1

解决:源数据为空,导入到Hive为NULL( string)字符串,目标mysql 字段长度为varchar(2)长度不够,报错。加入 --null-string “\N” --null-non-string “\N”

4.java.lang.IllegalArgumentException: Timestamp format must be yyyy-mm-dd hh:mm:ss[.fffffffff]

解决:时间格式在数据集市中为String,导入到堡垒机中会自动转换成对应时间格式。或者导入hive时指定导入时间格式。–map-column-java passtime=java.sql.Timestamp

5.将Hive中数据导入到Oracle中注意:Sqoop导出语句要注意 目标 Table 名 要为大写。Oracle中表名有大小写区分。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值