2016-02-28 80 views
8

sqoop import --connect jdbc:teradata://192.168.xx.xx/DBS_PORT=1025,DATABASE=ds_tbl_db --driver com.teradata.jdbc.TeraDriver --username dbc --password dbc --query 'select * from reason where id>20' --hive-import --hive-table reason_hive --target-dir <hdfs-location> -m 1Sqoop进口与where子句

我得到了错误:

Query [select * from reason where id>20] must contain '$CONDITIONS' in WHERE clause.

我知道必须有查询Sqoop where子句。

所以,对于像

select * from reason

查询我将它修改为:

select * from reason WHERE $CONDITIONS

什么,从而提供具有where子句的查询呢?

回答

16

您必须添加AND \$CONDITIONS

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

请参考Sqoop documentation

+2

'和\ $ CONDITIONS'是需要的,如果你已经在双封闭查询引号。否则使用'AND $ CONDITIONS' –

3

Sqoop需要访问表中的元数据例如列类型信息。占位符$条件是默认设置为“1 = 0”,以确保该 接收sqoop专用型的信息。因此,在执行sqoop命令后,你会看到,被解雇的第一个查询是 默认$条件。后来,它通过基于映射器(-m)或--split-通过柱或--boundary查询的数目不同的值定义不同的范围取代的,使得整个数据集可被划分为不同的数据片或块和组块可以并行导入,并行可用。 Sqoop将自动替代该占位符与所生成的条件指定哪些数据的切片应当由每个单独的任务

例如转移,考虑SAMPLE_DATA表的列名称,ID和薪水。 你想取得与工资> 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 

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

SqlManager: Executing SQL statement: select * from sample_data where (1 = 0) AND salary > 1000 

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

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