SQOOP - 在哪里不使用--query

时间:2016-08-31 19:43:52

标签: sqoop

WHERE子句不与--where以及--query

一起使用

sqoop import --connect "jdbc:mysql://quickstart.cloudera:3306/retail_db" --username "retail_dba" --password "cloudera" --target-dir "/user/cloudera/sqoop_import_tables/departments21" --query "select * From orders where \$CONDITIONS" --where "order_id < 8000" --split-by order_id;

日志显示&#34; WHERE(order_id&lt; 8000)&#34; - 在BoundingValsQuery中忽略条件: -

16/08/31 12:20:26 INFO db.DBInputFormat: Using read commited transaction isolation
16/08/31 12:20:26 INFO db.DataDrivenDBInputFormat: BoundingValsQuery: SELECT MIN(order_id), MAX(order_id) FROM (select * From orders where  (1 = 1) ) AS t1
16/08/31 12:20:26 INFO db.IntegerSplitter: Split size: 17220; Num splits: 4 from: 1 to: 68883
16/08/31 12:20:26 DEBUG db.IntegerSplitter: Splits: [                           1 to                       68,883] into 4 parts
16/08/31 12:20:26 DEBUG db.IntegerSplitter:                            1
16/08/31 12:20:26 DEBUG db.IntegerSplitter:                       17,222
16/08/31 12:20:26 DEBUG db.IntegerSplitter:                       34,443
16/08/31 12:20:26 DEBUG db.IntegerSplitter:                       51,663
16/08/31 12:20:26 DEBUG db.IntegerSplitter:                       68,883
16/08/31 12:20:26 DEBUG db.DataDrivenDBInputFormat: Creating input split with lower bound 'order_id >= 1' and upper bound 'order_id < 17222'
16/08/31 12:20:26 DEBUG db.DataDrivenDBInputFormat: Creating input split with lower bound 'order_id >= 17222' and upper bound 'order_id < 34443'
16/08/31 12:20:26 DEBUG db.DataDrivenDBInputFormat: Creating input split with lower bound 'order_id >= 34443' and upper bound 'order_id < 51663'
16/08/31 12:20:26 DEBUG db.DataDrivenDBInputFormat: Creating input split with lower bound 'order_id >= 51663' and upper bound 'order_id <= 68883'
16/08/31 12:20:26 INFO mapreduce.JobSubmitter: number of splits:4
16/08/31 12:20:26 INFO mapreduce.JobSubmitter: Submitting tokens for job: job_1472622587119_0024

WHERE子句与--where以及--table一起正常工作。

sqoop import --connect "jdbc:mysql://quickstart.cloudera:3306/retail_db" --username "retail_dba" --password "cloudera" --target-dir "/user/cloudera/sqoop_import_tables/departments22" --table orders --where "order_id < 8000" --split-by order_id

日志显示&#34; WHERE(order_id&lt; 8000)&#34; - 条件得到尊重。

16/08/31 12:34:35 INFO db.DataDrivenDBInputFormat: BoundingValsQuery: SELECT MIN(`order_id`), MAX(`order_id`) FROM `orders` WHERE ( order_id < 8000 )
16/08/31 12:34:35 INFO db.IntegerSplitter: Split size: 1999; Num splits: 4 from: 1 to: 7999
16/08/31 12:34:35 DEBUG db.IntegerSplitter: Splits: [                           1 to                        7,999] into 4 parts
16/08/31 12:34:35 DEBUG db.IntegerSplitter:                            1
16/08/31 12:34:35 DEBUG db.IntegerSplitter:                        2,001
16/08/31 12:34:35 DEBUG db.IntegerSplitter:                        4,001
16/08/31 12:34:35 DEBUG db.IntegerSplitter:                        6,000
16/08/31 12:34:35 DEBUG db.IntegerSplitter:                        7,999
16/08/31 12:34:35 DEBUG db.DataDrivenDBInputFormat: Creating input split with lower bound '`order_id` >= 1' and upper bound '`order_id` < 2001'
16/08/31 12:34:35 DEBUG db.DataDrivenDBInputFormat: Creating input split with lower bound '`order_id` >= 2001' and upper bound '`order_id` < 4001'
16/08/31 12:34:35 DEBUG db.DataDrivenDBInputFormat: Creating input split with lower bound '`order_id` >= 4001' and upper bound '`order_id` < 6000'
16/08/31 12:34:35 DEBUG db.DataDrivenDBInputFormat: Creating input split with lower bound '`order_id` >= 6000' and upper bound '`order_id` <= 7999'
16/08/31 12:34:35 INFO mapreduce.JobSubmitter: number of splits:4
  1. 任何logcal原因,为什么--where选项无法使用--query并使用--table
  2. 如果选择--query,我们如何使用--where提供额外的过滤功能?
  3. 对此有任何文件表示赞赏。

3 个答案:

答案 0 :(得分:2)

您的所有其他问题已经得到解答。我正在挑选 -

  

为什么--where选项无法使用--query并使用--table

因为它可能导致含糊不清的结果。

例如,

你放--where id > 100

--query "select * from table where order_id < 100 and \$CONDITIONS"

现在你期望sqoop回归什么?

因此,这可能令人困惑,并从用户的角度导致错误的结果。

您始终可以将您的WHERE条件放在--query中。因此,--where代码不需要--query标记。

--where--query 的子集。

答案 1 :(得分:1)

您可以随时在自由格式查询中进行过滤,例如

... --query "select ... where order_id < 8000 and \$CONDITIONS" ...

当然,此处使用query选项是不必要的,因为您无论如何都要选择所有行。因此,您可以删除查询部分并添加--where "order_id < 8000"

基本上,它是一个或另一个(--query--where);使用两者都没有意义。有关详细信息,请参阅documentation

答案 2 :(得分:0)

使用自由格式查询(--query)如果使用 - 它将被sqoop忽略。 sqoop将优先考虑--query ....

中提到的where子句