分享

sqoop 常见问题及解决办法(sqoop增量倒入)

desehawk 2014-11-6 17:33:33 发表于 实操演练 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 6 77429

问题导读
1. sqoop导入hive数据到MySql碰到hive表中列的值为null的情况是什么原因?
2.sqoop增量方式导入有几种方式?







一  业务场景 Hive 查询Hql的结果进入MySql,目前本人是通过两步来实现的,
1 把hive查询结果直接进入Hive的表a(a表需要创建,结构需要和b一样)
2 通过sqoop把表a的内容导入到MySql表b(b表已经存在),
这个时候你需要现在hive上创建a表,假如b表字段很多,你需要一个一个字段写到建表语句。我是不想写。估计你也是,都是通过sqoop直接把MySQL的b表导入到hive,因为hive表默认的分隔符是'\001',所以倒过来的时候要注意,带上表分隔符参数
--fields-terminated-by '\t',如下:
sqoop import --connect jdbc:mysql://db.foo.com/corp --table EMPLOYEES \
--fields-terminated-by '\t'
要想通过sqoop把hive的表导入MySql,hive上的表分隔符一定要是'\t',sqoop才能顺利导入,如果你使用默认的,即使在用sqoop导入的时候通过参数--input-fields-terminated-by '\001'也不行的。一定是--input-fields-terminated-by '\t' 才行。

二 sqoop导入hive数据到MySql碰到hive表中列的值为null的情况。
在导入数据的过程中,如果碰到列值为null的情况,hive中为null的是以\N代替的,所以你在导入到MySql时,需要加上两个参数:--input-null-string '\\N' --input-null-non-string '\\N',多加一个'\',是为转义。如果你通过这个还不能解决字段为null的情况,还是报什么NumberFormalt异常的话,那就是比较另类的了,没有关系,我们还是要办法解决,这就是终极武器。呵呵
你应该注意到每次通过sqoop导入MySql的时,都会生成一个以MySql表命名的.java文件,然后打成JAR包,给sqoop提交给hadoop 的MR来解析Hive表中的数据。那我们可以根据报的错误,找到对应的行,改写该文件,编译,重新打包,sqoop可以通过 -jar-file ,--class-name 组合让我们指定运行自己的jar包中的某个class。来解析该hive表中的每行数据。脚本如下:一个完整的例子如下:

  1. ./bin/sqoop export --connect "jdbc:mysql://localhost/aaa?useUnicode=true&characterEncoding=utf-8"
  2. --username aaa --password bbb --table table
  3. --export-dir /hive/warehouse/table --input-fields-terminated-by '\t'
  4. --input-null-string '\\N' --input-null-non-string '\\N'
  5. --class-name com.chamago.sqoop.codegen.bi_weekly_sales_item
  6. --jar-file /tmp/sqoop-chamago/bi_weekly_sales_item.jar
复制代码



上面--jar-file 参数指定jar包的路径。--class-name 指定jar包中的class。
这样就可以解决所有解析异常了。
下面贴下sqoop经常用的命令,
1 导入MySQL表到Hive

  1. ./sqoop import --connect jdbc:mysql://localhost/aaa?useUnicode=true&characterEncoding=utf-8 --username
  2. aaa --password bbb --table table2 --hive-import
复制代码




三 sqoop增量倒入
sqoop支持两种增量MySql导入到hive的模式,
一种是 append,即通过指定一个递增的列,比如:
--incremental append  --check-column num_iid --last-value 0
另种是可以根据时间戳,比如:
--incremental lastmodified --check-column created --last-value '2012-02-01 11:0:00'
就是只导入created 比'2012-02-01 11:0:00'更大的数据。




已有(6)人评论

跳转到指定楼层
wubaozhou 发表于 2015-1-1 20:16:13
回复

使用道具 举报

pioneer 发表于 2015-4-15 19:55:23

问楼主一个问题,我的sqoop2服务端与客户端启动成功,但是sqoop指令不起作用:sqoop command not found,知道如何解决吗?
回复

使用道具 举报

yhb007008 发表于 2016-7-18 17:52:20
楼主,我有个问题,如果-incremental lastmodified --check-column created --last-value '2012-02-01 11:0:00'  中created的属性是字符串.这种更新还能实现吗?
回复

使用道具 举报

夏洛特猫 发表于 2017-4-8 11:22:49
想问下楼主,sqoop1GB以上的数据量无法传输 只能在1mb一下传输??
回复

使用道具 举报

NEOGX 发表于 2017-4-8 14:04:59
夏洛特猫 发表于 2017-4-8 11:22
想问下楼主,sqoop1GB以上的数据量无法传输 只能在1mb一下传输??

楼主是指网速?还是说传输1G的数据。
网速1G这个不敢说。但是比如你有1G的数据,用sqoop传输是没有问题的。
回复

使用道具 举报

夏洛特猫 发表于 2017-4-10 07:42:26
NEOGX 发表于 2017-4-8 14:04
楼主是指网速?还是说传输1G的数据。
网速1G这个不敢说。但是比如你有1G的数据,用sqoop传输是没有问题 ...

谢谢您的回复 是传输的数据量
回复

使用道具 举报

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

本版积分规则

关闭

推荐上一条 /2 下一条