使用where子句进行SQL查询的Sqoop导入

dev*_*v ツ 14 sqoop

select * from reason

我收到了错误:

查询[select*from reason where where 20]必须在WHERE子句中包含'$ CONDITIONS'.

我知道在查询Sqoop时必须有一个where子句.

所以,对于像这样的查询

select * from reason WHERE $CONDITIONS

我将其修改为:

where

如果查询有select * from reason条款怎么办?

小智 25

你必须添加 AND \$CONDITIONS

--query "select * from reason where id>20 AND \$CONDITIONS"

请参阅Sqoop文档.

  • 如果您将查询括在双引号中,则需要"AND\$ CONDITIONS".否则使用`AND $ CONDITIONS` (3认同)

Nik*_*ide 5

Sqoop 需要访问表的元数据,例如列类型信息。占位符 $CONDITIONS 默认设置为 '1 = 0' 以确保 sqoop 只接收类型信息。因此,在执行 sqoop 命令后,您将看到第一个被触发的查询是默认的 $CONDITIONS。稍后,它被替换为基于映射器数量(-m)或--split-by列或--boundary-query定义不同范围的不同值,以便整个数据集可以分为不同的数据切片或块和块可以在尽可能多的并发的情况下并行导入。Sqoop 将自动用生成的条件替换这个占位符,指定每个单独的任务应该传输哪个数据片

例如,考虑带有列名称、ID 和薪水的 sample_data 表。您想获取工资 > 1k 的记录。

 sqoop import \ 
    --connect "jdbc:mysql://quickstart.cloudera:3306/retail_db" \
    --username retail_dba --password cloudera \
    --query 'select * from sample_data where $CONDITIONS AND salary > 1000' \
    --split-by salary \
    --target-dir hdfs://quickstart.cloudera/user/cloudera/sqoop_new
Run Code Online (Sandbox Code Playgroud)

以下是返回空集的第一个查询。

SqlManager: Executing SQL statement: select * from sample_data where  (1 = 0)  AND salary > 1000
Run Code Online (Sandbox Code Playgroud)

然后下一个查询是获取范围的最小值和最大值。

INFO db.DataDrivenDBInputFormat: BoundingValsQuery: SELECT MIN(salary), MAX(salary) FROM (select * from sample_data where  (1 = 1)  AND salary > 1000) AS t1;
Run Code Online (Sandbox Code Playgroud)