我正在尝试使用--where选项通过使用下面的命令连接orders表和order\u items表来获取条件数据:
sqoop import \
--connect "jdbc:mysql://quickstart.cloudera:3306/retail_db" \
--username retail_dba \
--password cloudera \
--query "Select * from orders o join order_items oi on o.order_id = oi.order_item_order_id where \$CONDITIONS " \
--where "order_id between 10840 and 10850" \
--target-dir /user/cloudera/order_join_conditional \
--split-by order_id
现在我不知道这有什么问题,因为当我在mysql中运行相同的查询时,我得到41条记录,这是正确的,但是当我在sqoop中运行这个命令时,它将转储所有172198条记录。我不明白发生了什么,出了什么问题。
1条答案
按热度按时间pkwftd7m1#
运行并行导入时,sqoop将使用中指定的参数值
--split-by
代替$CONDITIONS
参数并生成不同的查询(将由不同的Map器执行)。例如,sqoop将首先尝试找到order_id
并且根据Map程序的数量,将尝试对所有可能值的不同子集执行查询order_id
.这样,您的查询将在内部转换为不同的并行查询,例如:
所以在这种情况下
--where
您单独指定的子句将不被使用,您将拥有所有记录。但在你的特殊情况下,你并不需要--split-by
标志,因为您只对特定(而且非常有限)的值范围感兴趣。所以你可以用这个来代替:另请注意
-m 1
最后(正如dev所指出的ツ) 代表--num-mappers
并允许您告诉sqoop您只想为导入过程使用一个Map器(因此,没有并行性)。如果值的范围更大,可以使用
--split-by
使用你的where
自由形式查询中的条件,利用并行性: