我想问一下是否有人可以向我详细解释一个sqoop“query”子命令的功能。
我要用这个视频的一个例子:
https://youtu.be/7oz_cctys5q?list=plf0swtfhti8rjvgpop-lujocpk-rlz-ye&t=1515
query=“select*from orders join orders\u items on orders.order\u id=order\u items.order\u item\u order\u id where$conditions”
如我们所见,在where条件中添加了一个参数“$conditions”。
可能我错了,但看了视频后,我明白了如果参数“$conditions”存在,条件将被替换为“1=1”,如果不存在,条件将被替换为“1=0”。
我的问题是:
1-为什么建议在“query”子命令的where子句中使用参数
2-如果在参数中确实有一个where子句,而我们想在“query”子命令中使用它,而不是在“where”子命令中使用它,会发生什么?
感谢你的帮助,
大卫。
1条答案
按热度按时间ar7v8xwq1#
我还没有完全理解你的疑问,不过让我试着回答。如果你在找别的东西,请告诉我。
1-为什么建议在“query”子命令的where子句中使用参数
sqoop并行地从rdbms导入数据。您可以通过使用
-m
或者--num-mappers
争论。默认情况下,sqoop将使用4个map任务。例如,如果有一个主键列为
order_id
最小值为0,最大值为1000,sqoop被指示使用4个任务,sqoop将运行4个进程,每个进程执行表单的sql语句SELECT * FROM orders WHERE $CONDITIONS
现在$conditions占位符将被替换如下对于Map任务1:
order_id >= 0 and order_id < 250
最后的sql看起来像从订单号>=0和订单号<250的订单中选择*
对于map任务2:
order_id >= 250 and order_id < 500
最后的sql看起来像从订单号>=250和订单号<500的订单中选择*
对于map任务3:
order_id >= 500 and order_id < 750
最后的sql看起来像从订单号>=500和订单号<750的订单中选择*
对于map任务4:
order_id >= 750 and order_id < 1001
最后的sql看起来像从订单号>=750和订单号<1001的订单中选择*
如您所见,$conditions是一个占位符,sqoop将搜索它并用生成的值替换它。请注意,如果Map任务数大于1,则必须指定$条件。
2-如果在参数中确实有一个where子句,而我们想在“query”子命令中使用它,而不是在“where”子命令中使用它,会发生什么?
您只需在$conditions前面加上前缀
AND
.例如,如果您只想加载订单金额大于100的订单。
query=“select*from orders join order\u items on orders.order\u id=order\u items.order\u item\u order\u id其中$conditions和order\u amount>100”
希望这能澄清!