Sqoop的一些使用心得

本文介绍了Sqoop在使用--query参数时遇到的问题,即不支持复杂的WHERE条件筛选,但发现结合--columns和--where可以满足需求。详细解释了--query中的$CONDTIONS如何与--split-by配合工作,通过举例说明如何通过split-by指定的列进行数据划分,并在多个map中执行SQL,实现数据导入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

sqoop作为从关系型数据库导入hdfs的工具,我们在从关系型数据库中导出数据时可先做数据筛选,选定我们所要的数据,能大大的减轻数据负担,即sql语句后加where条件的实现!
经测试可执行sqoop脚本如下:
sqoop import --connect jdbc:oracle:thin:@IP:PORT:SCHEMA --username username -password=password --table XXX --columns "columns" --where " c1>=to_date('2015-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss') and c1<=to_date('2015-02-01 00:00:00','yyyy-mm-dd hh24:mi:ss') "  -m 8 --split-by ID --fields-terminated-by '^' --target-dir /importdata/XXX/
原测试sqoop脚本如下:
sqoop import --connect jdbc:oracle:thin:@IP:PORT:SCHEMA --username username -password=password  --query ‘select columns from talbename where 1=1 and $CONDTIONS' --where " c1>=to_date('2015-01-0100:00:00','yyyy-mm-dd hh24:mi:ss') and c1<=to_date('2015-02-01 00:00:00','yyyy-mm-dd hh24:mi:ss') "  -m 8 --split-by ID --fields-terminated-by '^' --target-dir /importdata/XXX/
或测试脚本为:
sqoop import --connect jdbc:oracle:thin:@IP:PORT:SCHEMA --username username -password=password  --query ‘select columns from talbename where 1=1 and c1>=to_date('2015-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss') and c1<=to_date('2015-02-01 00:00:00','yyyy-mm-dd hh24:mi:ss') and $CONDTIONS' -m 8 --split-by ID --fields-terminated-by '^' --target-dir /importdata/XXX/
或测试脚本为:
sqoop import --connect jdbc:oracle:thin:@IP:PORT:SCHEMA --username username -password=password  --query ‘select columns from talbename where 1=1 and $CONTIONS and c1>=to_date('2015-01-01 00:00:00','yyyy-mm-dd hh24:mi:ss') and c1<=to_date('2015-02-01 00:00:00','yyyy-mm-dd hh24:mi:ss') ' -m 8 --split-by ID --fields-terminated-by '^' --target-dir /importdata/XXX/
或者其他一些测试脚本,在使用时有心得如下;

--query似乎并不能支持复杂where条件筛选,但必须有where语句与$CONDTIONS,--query即使后面加--where 参数也还是无法起到作用,现在测试通过的情况仅有--columns与--where合用时是满足要求的!

sqoop --query参数中where语句与$CONDTIONS占位符合用是将由--split-by参数划分出的每个map执行SQL补全,如:
a. 通过split-by id指定 map数据划分所依据的列
b. sqoop运行 select max(id), min(id) from
xxx 获得数据范围,比如max(id) = 100, min(id) = 1
c. sqoop若指定使用4个map进行数据的导入,因此在情况下,可将id的区间分为4段,通过不同的map进行导入,分别为:
1 <= id and id <= 25
26 <= id and id <= 50
51 <= id and id <= 75
76 <= id and id <= 100
d. 每个map将SQL补全,比如 select * from
xxx where (1 <= id and id <= 25). 用(1 <= id and id <= 25) 替代了--query中的占位符 $CONDITIONS

以上为sqoop从关系型数据库导入hdfs使用心得,新人使用,可能理解有误,还请交流!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值