我想问问是否有人可以向我详细解释Sqoop“查询”子命令功能。
我将使用此视频的示例:
https://youtu.be/7oZ_CctyS5Q?list=PLf0swTFhTI8rJvGpOp-LujOcpk-Rlz-yE&t=1515
query =“ select * from order joins order.order_id = order_items.order_item_order_id where \ $ CONDITIONS” \
如我们所见,where条件中添加了一个参数“ $ CONDITIONS”。
可能是我错了,但是看完视频后,我知道如果参数“ $ CONDITIONS”存在,则条件将替换为“ 1 = 1”,否则将替换为“ 1 = 0”。
我的问题是:
1-为什么建议在“查询”子命令的where子句中使用该参数
2-如果我们确实要在“查询”子命令而不是“ where”子命令中使用的参数中有一个WHERE子句,会发生什么情况?
感谢您的帮助,
大卫。
答案 0 :(得分:0)
我不确定您的查询,但是让我尝试回答。让我知道您是否正在寻找其他东西。
1-为什么建议在“查询”子命令的Where子句中使用该参数
SQOOP从RDBMS并行导入数据。您可以通过使用-m
或--num-mappers
参数来指定用于执行导入的任何映射任务(并行处理)。默认情况下,SQOOP将使用4个映射任务。
例如,如果您有一个表,其主键列为order_id
,其最小值为0而最大值为1000,并且SQOOP被定向为使用4个任务,则SQOOP将运行四个进程,每个进程均执行形式的SQL语句
SELECT * FROM orders WHERE $CONDITIONS
现在$ CONDITIONS个占位符将被替换为
用于地图任务1:order_id >= 0 and order_id < 250
最终的SQL看起来像
SELECT * FROM订单,其中order_id> = 0且order_id <250
用于地图任务2:order_id >= 250 and order_id < 500
最终的SQL看起来像
选择*从订单的订单ID> = 250和订单ID <500
用于地图任务3:order_id >= 500 and order_id < 750
最终的SQL看起来像
选择*从订单的订单ID> = 500和订单ID <750
对于地图任务4:order_id >= 750 and order_id < 1001
最终的SQL看起来像
选择*从订单中的order_id> = 750和order_id <1001
如您所见,$ CONDITIONS是一个占位符,SQOOP将搜索并替换为生成的值。请注意,如果没有任何地图任务大于1,则必须指定$ CONDITIONS。
2-如果在参数中确实要使用WHERE子句,而该子句要在“查询”子命令中而不是在“ where”子命令中使用,会发生什么情况?
您只需在$ CONDITIONS后面加上AND
即可指定过滤条件。
例如,如果您只想加载订单金额大于100的订单。
query =“ select * fromorders加入order.order_id = order_items.order_item_order_id上的order_items,其中\ $ CONDITIONS AND order_amount> 100”
希望这可以澄清!