用sqoop导入大表的问题

用sqoop全量地往HDFS中导入一张大表,大概30G左右。运行的过程总是不成功,抓了日志分析,发现是sqoop运行时候抛出了MySQL的异常:
java.sql.SQLException: Incorrect key file for table '/tmp/#sql_f27_0.MYI'; try to repair it

再分析,发现是sqoop解析SQL语句后,会组装出一条边界确认的SQL脚本,类似这样的
SELECT MIN(id), MAX(id) FROM (select id,xxoo from [big_table] a where  (1 = 1) ) AS t1

这个脚本会把大表全部读取到MySQL服务器的内存中,再找出min(id)与max(id),所以服务器才会抛出上面的Incorrect key file for table '/tmp/#sql_f27_0.MYI' 的异常。

只要不让sqoop用这个SQL脚本,改用select min(id),max(id) from [big_table]就好了。
翻阅了sqoop的api文档,发现我可以通过设置--boundary-query这个参数来实现我的需求。

把--boundary-query select min(id),max(id) from [big_table] 加入到我的sqoop脚本中后,运行成功!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值