2015-07-20 31 views
1

我使用sqoop將數據從mysql導入到以csv格式的hadoop中,使用table參數時效果很好。但是,當我使用查詢參數時,它只能導入第一列,其他列都會丟失。sqoop導入查詢只導入第一列

在這裏你是我的命令。

sqoop import \ 
--connect jdbc:mysql://127.0.0.1:3306/sqoop \ 
--username root \ 
--password root \ 
--query ' select age, job from person where $CONDITIONS ' \ 
--bindir /tmp/sqoop-hduser/compile \ 
--fields-terminated-by ',' \ 
--target-dir /Users/hduser/hadoop_data/onedaydata -m1 

在csv文件中,它只顯示年齡。 有誰知道如何解決它? 謝謝

+0

我會添加更多關於您的案例的細節(數據庫DDL,數據,Sqoop版本,...) –

回答

0

無論何時您使用--query參數,您需要指定--split-by參數以及應用於將數據分片爲多個並行任務的列。另一個必需參數是--target-dir,它指定HDFS上應該存儲數據的目錄。

解決方案:嘗試在您的sqoop命令中包含--split-by參數,並查看錯誤是否已解決。

1

從sqoop用戶指南閱讀本文檔,當您使用$條件時,您必須指定拆分列。

Sqoop也可以導入任意SQL查詢的結果集。您可以使用--query參數指定SQL語句,而不是使用--table,--columns和--where參數。 導入自由格式查詢時,必須使用--target-dir指定目標目錄。

如果要並行導入查詢結果,則每個映射任務都需要執行查詢的副本,結果按由Sqoop推斷的邊界條件進行劃分。

您的查詢必須包含令牌$ CONDITIONS,每個Sqoop進程將用一個唯一的條件表達式替換。您還必須使用--split-by選擇拆分列。

例如:

$ sqoop import \ 
    --query 'SELECT a.*, b.* FROM a JOIN b on (a.id == b.id) WHERE $CONDITIONS' \ 
    --split-by a.id --target-dir /user/foo/joinresults 

可替換地,查詢可以被執行一次,並用-m 1串聯進口,通過指定一個單一的映射任務:

$ sqoop import \ 
    --query 'SELECT a.*, b.* FROM a JOIN b on (a.id == b.id) WHERE $CONDITIONS' \ 
    -m 1 --target-dir /user/foo/joinresults 
1

嘗試這種情況:

sqoop import \ 
--connect jdbc:mysql://127.0.0.1:3306/sqoop \ 
--username root \ 
--password root \ 
**--columns "First_Column" \** 
--bindir /tmp/sqoop-hduser/compile \ 
--fields-terminated-by ',' \ 
--target-dir /Users/hduser/hadoop_data/onedaydata -m1