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

时间:2016-02-28 08:36:04

标签: sqoop

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 1

我收到了错误:

  

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

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

所以,对于像

这样的查询

select * from reason

我将其修改为:

select * from reason WHERE $CONDITIONS

如何处理具有where子句的查询?

6 个答案:

答案 0 :(得分:21)

您必须添加AND \$CONDITIONS

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

请参阅Sqoop documentation

答案 1 :(得分:3)

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

例如,考虑带有列名,id和salary的sample_data表。 您想要获取工资&gt;的记录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;

答案 2 :(得分:0)

您可以使用Where Where子句

- “order_status ='CLOSED'”

https://sqoop.apache.org/docs/1.4.2/SqoopUserGuide.html

答案 3 :(得分:0)

我正在cloudera工作,正在查询Mysql中的表列表。
我得到以下列出的查询的结果:

sqoop import --connect jdbc:mysql://127.0.0.1/Mydatabase
    --username root --password cloudera 
    --query 'select * from employee where $CONDITIONS AND Sal<250000' 
    --split-by Sal --target-dir=user/cloudera/myfirstdata2 -m 1

答案 4 :(得分:0)

使用自由格式查询时,只需确保在$ CONDITIONS之前放置'\',就可以了。这是我在Cloudera Quickstart VM上尝试过的示例,它运行良好。

sqoop import --connect jdbc:mysql://quickstart.cloudera/retail_db --username retail_dba --password cloudera --query“选择来自客户的customer.customer_fname,customers.customer_lname,orders.order_id,orders.order_date加入(customers.customer_id = orders.order_customer_id)上的订单在哪里\ $ CONDITIONS“ --as-parquetfile-被” orders.order_customer_id“分割--target-dir” / user / cloudera / problem2 / data / cusotmers“

有关详细文档,请参阅此链接: https://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html#_free_form_query_imports

答案 5 :(得分:0)

您可以如下设置

  • 如果数据库是oracle,则select * from (query) where $CONDITIONS否则为select * from (query) as T where $CONDITIONS

请让我知道是否有任何问题。