SQOOP 导入错误 --query without where $CONDITION

SQOOP import error with --query without where $CONDITION

我有一个 dept_nopk table 。这个 table 有两列,department_iddepartment_name 而这个 table 没有任何主键。我正在尝试使用以下 SQOOP 命令将此 table 导入 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 中描述的错误背后的原因?

Question 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

Question 2

查看类似问题:

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

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