Sqoop 导入具有 SQL 查询和 where 子句

Sqoop import having SQL query with where clause

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

我收到错误:

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

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

所以,对于

这样的查询

select * from reason

我修改为:

select * from reason WHERE $CONDITIONS

如何处理包含 where 子句的查询?

您必须添加 AND $CONDITIONS

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

请参考Sqoop documentation .

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

例如,考虑 sample_data table 列名称、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

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

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;

您可以使用 Where 子句

--其中 "order_status = 'CLOSED'"

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

我在 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

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

sqoop import --connect jdbc:mysql://quickstart.cloudera/retail_db --用户名retail_dba --密码cloudera --query "select customers.customer_fname, customers.customer_lname, orders.order_id, orders.order_date from customers join orders on (customers.customer_id = orders.order_customer_id) WHERE $CONDITIONS" --as-parquetfile --split-by "orders.order_customer_id" --target-dir "/user/cloudera/problem2/data/cusotmers"

详细文档请参考此link: https://sqoop.apache.org/docs/1.4.7/SqoopUserGuide.html#_free_form_query_imports

您可以如下设置

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

如果有任何问题,请告诉我。