SQOOP 导入错误 --query without where $CONDITION
SQOOP import error with --query without where $CONDITION
我有一个 dept_nopk
table 。这个 table 有两列,department_id
和 department_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 参数一起使用。
我有一个 dept_nopk
table 。这个 table 有两列,department_id
和 department_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 参数一起使用。