Sqoop - 导入 - 查询子命令 - where 子句中的参数
Sqoop - Import - Query subcommand - Parameters in where clause
我想请问是否有人可以详细解释 Sqoop "query" 子命令的功能。
我将使用此视频的示例:
https://youtu.be/7oZ_CctyS5Q?list=PLf0swTFhTI8rJvGpOp-LujOcpk-Rlz-yE&t=1515
查询="select * from orders join order_items on orders.order_id = order_items.order_item_order_id where $CONDITIONS"\
我们可以看到,在where条件中添加了一个参数"$CONDITIONS"
可能我错了,但看完视频后,我明白了如果参数“$CONDITIONS”存在,条件将被替换为“1=1”,如果不存在,则被替换为“1=0”。
我的问题是:
1- 为什么建议在"query"子命令
的Where子句中使用参数
2- 如果我们想在 "query" 子命令而不是 "where" 子命令中使用的参数中真的有一个 WHERE 子句会怎样?
感谢您对此的帮助,
大卫.
我没有完全理解你的问题,但让我试着回答一下。如果您正在寻找其他东西,请告诉我。
1- 为什么推荐在"query"子命令的Where子句中使用参数
SQOOP 从 RDBMS 并行导入数据。您可以使用 -m
或 --num-mappers
参数指定要用于执行导入的地图任务(并行进程)的数量。默认情况下,SQOOP 将使用 4 个映射任务。
例如,如果您有一个 table,其主键列为 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 orders WHERE order_id >= 0 and order_id < 250
地图任务 2:order_id >= 250 and order_id < 500
最后 SQL 看起来像
SELECT * FROM orders WHERE order_id >= 250 and order_id < 500
地图任务 3:order_id >= 500 and order_id < 750
最后 SQL 看起来像
SELECT * FROM orders WHERE order_id >= 500 and order_id < 750
地图任务 4:order_id >= 750 and order_id < 1001
最后 SQL 看起来像
SELECT * FROM orders WHERE order_id >= 750 and order_id < 1001
如您所见,$CONDITIONS 是一个占位符,SQOOP 将搜索该占位符并将其替换为生成的值。请注意,如果地图任务数大于 1,则必须指定 $CONDITIONS。
2- 如果我们想在 "query" 子命令而不是 "where" 子命令中使用的参数中真的有一个 WHERE 子句会怎样?
您可以在以 AND
为前缀的 $CONDITIONS 之后简单地指定您的过滤条件。
例如,如果您只想加载订单金额大于 100 的订单。
query="select * from orders join order_items on orders.order_id = order_items.order_item_order_id where $CONDITIONS AND order_amount > 100"
希望这能说明问题!
我想请问是否有人可以详细解释 Sqoop "query" 子命令的功能。
我将使用此视频的示例:
https://youtu.be/7oZ_CctyS5Q?list=PLf0swTFhTI8rJvGpOp-LujOcpk-Rlz-yE&t=1515
查询="select * from orders join order_items on orders.order_id = order_items.order_item_order_id where $CONDITIONS"\
我们可以看到,在where条件中添加了一个参数"$CONDITIONS"
可能我错了,但看完视频后,我明白了如果参数“$CONDITIONS”存在,条件将被替换为“1=1”,如果不存在,则被替换为“1=0”。
我的问题是:
1- 为什么建议在"query"子命令
的Where子句中使用参数2- 如果我们想在 "query" 子命令而不是 "where" 子命令中使用的参数中真的有一个 WHERE 子句会怎样?
感谢您对此的帮助,
大卫.
我没有完全理解你的问题,但让我试着回答一下。如果您正在寻找其他东西,请告诉我。
1- 为什么推荐在"query"子命令的Where子句中使用参数
SQOOP 从 RDBMS 并行导入数据。您可以使用 -m
或 --num-mappers
参数指定要用于执行导入的地图任务(并行进程)的数量。默认情况下,SQOOP 将使用 4 个映射任务。
例如,如果您有一个 table,其主键列为 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 orders WHERE order_id >= 0 and order_id < 250
地图任务 2:
order_id >= 250 and order_id < 500
最后 SQL 看起来像SELECT * FROM orders WHERE order_id >= 250 and order_id < 500
地图任务 3:
order_id >= 500 and order_id < 750
最后 SQL 看起来像SELECT * FROM orders WHERE order_id >= 500 and order_id < 750
地图任务 4:
order_id >= 750 and order_id < 1001
最后 SQL 看起来像SELECT * FROM orders WHERE order_id >= 750 and order_id < 1001
如您所见,$CONDITIONS 是一个占位符,SQOOP 将搜索该占位符并将其替换为生成的值。请注意,如果地图任务数大于 1,则必须指定 $CONDITIONS。
2- 如果我们想在 "query" 子命令而不是 "where" 子命令中使用的参数中真的有一个 WHERE 子句会怎样?
您可以在以 AND
为前缀的 $CONDITIONS 之后简单地指定您的过滤条件。
例如,如果您只想加载订单金额大于 100 的订单。
query="select * from orders join order_items on orders.order_id = order_items.order_item_order_id where $CONDITIONS AND order_amount > 100"
希望这能说明问题!