sqoop中where子句的使用问题

nwsw7zdq  于 2021-06-03  发布在  Sqoop
关注(0)|答案(1)|浏览(399)

我正在尝试使用--where选项通过使用下面的命令连接orders表和order\u items表来获取条件数据:

  1. sqoop import \
  2. --connect "jdbc:mysql://quickstart.cloudera:3306/retail_db" \
  3. --username retail_dba \
  4. --password cloudera \
  5. --query "Select * from orders o join order_items oi on o.order_id = oi.order_item_order_id where \$CONDITIONS " \
  6. --where "order_id between 10840 and 10850" \
  7. --target-dir /user/cloudera/order_join_conditional \
  8. --split-by order_id

现在我不知道这有什么问题,因为当我在mysql中运行相同的查询时,我得到41条记录,这是正确的,但是当我在sqoop中运行这个命令时,它将转储所有172198条记录。我不明白发生了什么,出了什么问题。

pkwftd7m

pkwftd7m1#

运行并行导入时,sqoop将使用中指定的参数值 --split-by 代替 $CONDITIONS 参数并生成不同的查询(将由不同的Map器执行)。例如,sqoop将首先尝试找到 order_id 并且根据Map程序的数量,将尝试对所有可能值的不同子集执行查询 order_id .
这样,您的查询将在内部转换为不同的并行查询,例如:

  1. SELECT * FROM orders o join order_items oi on o.order_id = oi.order_item_order_id
  2. WHERE (order_id >=0 AND order_id < 10000)
  3. SELECT * FROM orders o join order_items oi on o.order_id = oi.order_item_order_id
  4. WHERE (order_id >=1000 AND order_id < 20000)
  5. ...

所以在这种情况下 --where 您单独指定的子句将不被使用,您将拥有所有记录。但在你的特殊情况下,你并不需要 --split-by 标志,因为您只对特定(而且非常有限)的值范围感兴趣。所以你可以用这个来代替:

  1. sqoop import \
  2. --connect "jdbc:mysql://quickstart.cloudera:3306/retail_db" \
  3. --username retail_dba \
  4. --password cloudera \
  5. --query "Select * from orders o join order_items oi on o.order_id = oi.order_item_order_id WHERE (order_id BETWEEN 10840 AND 10850)" \
  6. --target-dir /user/cloudera/order_join_conditional \
  7. -m 1

另请注意 -m 1 最后(正如dev所指出的ツ) 代表 --num-mappers 并允许您告诉sqoop您只想为导入过程使用一个Map器(因此,没有并行性)。
如果值的范围更大,可以使用 --split-by 使用你的 where 自由形式查询中的条件,利用并行性:

  1. sqoop import \
  2. --connect "jdbc:mysql://quickstart.cloudera:3306/retail_db" \
  3. --username retail_dba \
  4. --password cloudera \
  5. --query "Select * from orders o join order_items oi on o.order_id = oi.order_item_order_id WHERE (order_id BETWEEN 10840 AND 10850) AND \$CONDITIONS" \
  6. --target-dir /user/cloudera/order_join_conditional \
  7. --split-by order_id
展开查看全部

相关问题