在没有$ CONDITION

时间:2016-09-03 15:35:17

标签: sqoop

我有一张dept_nopk表。此表有两列department_iddepartment_name,此表没有任何主键。我正在尝试使用以下SQOOP命令在HDFS中导入此表。

sqoop import \
--connect "jdbc:mysql://quickstart.cloudera:3306/retail_db"
--username useranem
--password pass
--query "select * from dept_nopk where department_id <> 1000"
--target-dir /user/cloudera/departments
-m 1

但它出现以下错误:

java.io.IOException: query[select * from dept_nopk where department_id <> 1000] must contain $CONDITION in where clause

我现在的问题是:

1)当我已经指定地图的数量只有1时,为什么会出现此错误?是否有必要将$CONDITION放入我的where条款中?

2)我第二次更改我的查询如下

sqoop import \
--connect "jdbc:mysql://quickstart.cloudera:3306/retail_db"
--username useranem
--password pass
--query "select * from dept_nopk where \$CONDITIONS"
--target-dir /user/cloudera/departments
--where "department_id <> 8000"            
-m 1

我将--where用于department_id<>8000并指定了\$CONDITIONS。现在我没有得到任何错误,但在结果中它也导入了带department_id =8000的行,即它完全忽略了--where参数。为什么呢?

3)我尝试了以下,并且效果很好。

sqoop import \
--connect "jdbc:mysql://quickstart.cloudera:3306/retail_db"
--username useranem
--password pass
--query "select * from dept_nopk where department_id <> 8000 and \$CONDITIONS"
--target-dir /user/cloudera/departments          
-m 1 

请您解释1)和2中描述的错误背后的原因?

2 个答案:

答案 0 :(得分:1)

  

问题1

在Sqoop中添加$CONDITION是必需的,即使有1个映射器,因为Sqoop转换查询1个映射器,如 -

要获取元数据:

select * from dept_nopk where 1 = 0

\$CONDITIONS替换为1 = 0

获取所有数据:

select * from dept_nopk where 1 = 1

\$CONDITIONS替换为1 = 1

  

问题2

检查类似问题:SQOOP --where is not working with --query

答案 1 :(得分:1)

* - 其中与--query互斥(如果包含,则忽略) [逻辑上,你可以添加--query来添加你的caluse]

* $ CONDITIONS与您的条件(where子句)无关。它(在--query和中是必需的)在内部用于并行化结果,即使映射器大于1.它与--split-by参数一起使用。