2016-02-28 79 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;