2016-08-11 53 views
1

MySQL表與作爲的dept_id主鍵Sqoop --split-由誤差儘管具有表主鍵

|dept_id | dept_name | 
| 2 | Fitness 
| 3 | Footwear 
| 4 | Apparel 
| 5 | Golf  
| 6 | Outdoors 
| 7 | Fan Shop 

Sqoop查詢的同時導入

sqoop import \ 
-m 2 \ 
--connect "jdbc:mysql://quickstart.cloudera:3306/retail_db" \ 
--username retail_dba \ 
-P \ 
--query 'select * from departments where dept_id < 6 AND $CONDITIONS' \  
--target-dir /user/cloudera/sqoop_import/departments; 

結果與一個控制檯上的錯誤:

當導入並行查詢結果,你必須指定--split-by

---問題點!---
儘管已經表的主鍵&劈叉可以同樣2名映射器之間的分佈又是什麼是- 需要 --m 1

引導我一樣。
謝謝。

回答

0

它不是--split-by用法的主鍵。由於使用--query選項,您看到錯誤。此選項必須與查詢中的--split-by,--target-dir$CONDITIONS一起使用。

free_form_query_imports documentations

當導入自由形式的查詢,你必須指定--target-dir的目標 目錄。

如果要導入並行查詢的結果,那麼每個 map任務需要執行查詢的一個副本,由邊界由Sqoop推導出的條件劃分結果 。您的查詢必須 包含令牌$ CONDITIONS,其中每個Sqoop進程將用一個唯一條件表達式替換 。您還必須使用--split-by選擇拆分 列。

您可以使用--where選項,如果你不想使用--split-by--query:如果你使用--boundary-query選項,那麼你不需要--split-by--query選項

sqoop import \ 
    --connect "jdbc:mysql://quickstart.cloudera:3306/retail_db" \ 
    --username=retail_dba \ 
    -P \ 
    --table departments \ 
    --target-dir /user/cloudera/departments \ 
    -m 2 \ 
    --where "department_id < 6" 

sqoop import \ 
    --connect "jdbc:mysql://quickstart.cloudera:3306/retail_db" \ 
    --username=retail_dba \ 
    -P \ 
    --table departments \ 
    --target-dir /user/cloudera/departments \ 
    -m 2 \ 
    --boundary-query "select 2, 6 from departments limit 1" 

selecting_the_data_to_import

默認情況下,sqoop將使用查詢select min(<split-by>), max(<split-by>) from <table name>找出創建 拆分的邊界。在某些情況下,此查詢不是最優化的,因此您可以使用 - 邊界查詢參數指定任意查詢返回兩個數字列。

+0

加入已經回答了更多**花哨的**(與_related to question_)的細節。讓我知道如果你想更多upvotes或賞金..:D –

+0

@devツ - 謝謝 - 任何反饋,歡迎和讚賞。當我讀到你的答案時,它正在指導練習文檔,並沒有具體解釋'--query'參數所需的選項。我在'--split-by'和'--query'選項的上下文中添加了其他選項作爲備選選項,因此用戶可以看到在主鍵表導入和映射程序> 1時不使用'--split-by'實際上可能與這些選項(我發現它相關 - 在我看來) - 再次感謝:) –

+0

順便說一句是一個我固定的錯字,文檔指的是相同的sqoop文檔。 –

0

按sqoop docs

如果要導入並行查詢的結果,那麼每個地圖的任務需要執行查詢的一個副本,其中通過推斷邊界條件劃分結果Sqoop。您的查詢必須包含令牌$ CONDITIONS,其中每個Sqoop進程將用一個唯一的條件表達式替換。您還必須使用--split-by選擇拆分列。

所以,你必須指定主鍵--split-by標籤。

如果您選擇1個映射程序,Sqoop不會並行拆分任務並在1個映射程序中執行完整導入。

查看我的另一個answer,如果你想)瞭解需要$CONDITIONS和mappers的數量。

1

當您使用--query時,Sqoop導入需要--split-by的原因是因爲當您在「查詢」中指定數據的源位置時,無法知道/猜測主鍵Sqoop。因爲在查詢中,您可以加入兩個或多個表格,這些表格將包含多個鍵和字段。所以,Sqoop無法知道/猜測哪些鍵可以分裂。