Sqoop-导入-查询子命令-where子句中的参数

时间:2019-01-04 12:05:57

标签: import parameters where sqoop

我想问问是否有人可以向我详细解释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子句,会发生什么情况?

感谢您的帮助,

大卫。

1 个答案:

答案 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. 用于地图任务1:order_id >= 0 and order_id < 250 最终的SQL看起来像

      

    SELECT * FROM订单,其中order_id> = 0且order_id <250

  2. 用于地图任务2:order_id >= 250 and order_id < 500 最终的SQL看起来像

      

    选择*从订单的订单ID> = 250和订单ID <500

  3. 用于地图任务3:order_id >= 500 and order_id < 750 最终的SQL看起来像

      

    选择*从订单的订单ID> = 500和订单ID <750

  4. 对于地图任务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”

希望这可以澄清!