2016-11-28 673 views
2

假設我們沒有在那裏值均勻分佈列,假設我們有這樣的命令:SQOOP中的--split-by和--boundary-query有什麼區別?

sqoop import \ 
... 
--boundary-query "SELECT min(id), max(id) from some_table" 
--split-by id 
... 

這裏有什麼用--boundary查詢點,而--split-通過做的一樣? 有沒有其他的方式來使用 - 邊界查詢? 或者在沒有關鍵字(唯一)列的情況下以其他方式更有效地分割數據?

回答

7

--split-by id將分裂(默認4)映射器的數量的基礎上,將數據均勻地

現在默認的邊界查詢就是這樣的。

--boundary-query "SELECT min(id), max(id) from some_table" 

但如果你知道從val1id開始與val2結束。那麼計算min()max()的操作就沒有意義了。這將使sqoop命令執行更快。

您可以指定返回val1val2的任意查詢。


編輯:

現在(1.4.7)存在sqoop沒有辦法爲拆分指定不均勻分區。

例如,你有一個像數據:如果在命令中定義4名映射器

1,2,3,51,52,191,192,193,194,195,196,197,198,199,200 

。在我們的例子中,它將檢查最小和最大值是1和200。

然後將它分割成4個部分:

1-50 
51-100 
101-150 
151-200 

是,在這3映射器(101-150)將得到什麼從RDBMS表。

但是沒有辦法定義自定義分區,如:

1-10 
51-60 
190-200 

對於大數據(10億行的),實際上它是不適合找精確值這樣或使用其他工具來查找數據先模式化,然後準備自定義分區。

+0

我無法理解--split-by如何統一分割。如果我沒有一個接近均勻分佈的列,並且必須選擇一個; {1,25430002,25430002,25340003,25520001,27345001,... 24466002} 我知道這是一個荒謬的例子,但我想說的是--split-by處理4個節點(或者更多,除非你有1k個節點或者其他東西),通過將大於25000000的百萬個分配給單個節點只是因爲它有1個節點。 如何使用--split-by統一分割(如果表沒有均勻分佈的列)? – burakongun

+1

@burakongun查看我的[回覆](http://stackoverflow.com/questions/37042357/sqoop-data-splitting/37048390#37048390)瞭解數據分解如何在sqoop中工作。 –

+0

@burakongun檢查我編輯的答案。 –

0

--split-通過 對於自由形式的查詢進口,你需要指定 '分裂的'。 當您導入任何特定查詢的結果時,sqoop需要知道它將用於創建拆分的列名。 而導入表時,如果未指定,它將使用要導入的表的主鍵創建拆分。如果主鍵不均勻且不一致,則還可以使用分隔符指定任何其他列。

--boundary查詢 期間sqoop導入過程中,它使用這個查詢來計算製造分裂邊界:從表名)SELECT MIN(,MAX()。

在某些情況下,此查詢不是最優化的,因此您可以指定任何使用--boundary-query參數返回兩個數字列的任意 任意查詢。 這可以節省最小(分割)和最大(分割)操作,從而提高效率。