我有一张dept_nopk
表。此表有两列department_id
和department_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中描述的错误背后的原因?
答案 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
答案 1 :(得分:1)
* - 其中与--query互斥(如果包含,则忽略) [逻辑上,你可以添加--query来添加你的caluse]
* $ CONDITIONS与您的条件(where子句)无关。它(在--query和中是必需的)在内部用于并行化结果,即使映射器大于1.它与--split-by参数一起使用。