2015-05-04 14 views
1

我想在火星中實現等高分級。我面臨的主要問題是我的實現是線性的,不可擴展。火星上的等高分級

我想到一個辦法,但我覺得我的設計是非常低效的:

首先,我排序上分級必須完成的列的基礎上的數據集。然後我將它發送給一個函數,該函數將bin號碼分配給一個特定的值。

有人可以建議如何從不同的角度來解決這個問題?

anim wt 
1  1 181.0 
2  2 179.0 
3  3 180.5 
4  4 201.0 
5  5 201.5 
6  6 245.0 
7  7 246.4 
8  8 189.3 
9  9 301.0 
10 10 354.0 
11 11 369.0 
12 12 205.0 
13 13 199.0 
14 14 394.0 
15 15 231.3 

裝箱後(等高),「wt」列應該被分配一個bin值。

anim wt wt2 
1  1 181.0 1 
2  2 179.0 1 
3  3 180.5 1 
4  4 201.0 2 
5  5 201.5 2 
6  6 245.0 2 
7  7 246.4 3 
8  8 189.3 1 
9  9 301.0 3 
10 10 354.0 3 
11 11 369.0 3 
12 12 205.0 2 
13 13 199.0 1 
14 14 394.0 3 
15 15 231.3 2 

方案應基本上排序重量的值的基礎數據集,然後將其分割成區間,取元件的相等數目的成每個倉。

+0

你可以給一個輸入/輸出的例子嗎? –

+0

@ DanielL.添加了一個例子。謝謝 !! –

回答

0

這確實是一個難題。沒有多少方法可以有效排序,而且可以輕鬆分發的方式較少。我想你應該可以做一些類似於合併排序的工作,比如說,將N個條目分開,直到你得到N/K個條目,然後將它們分類並分成K個桶。合併操作可以是1遍,並且如果在任何時候桶的大小超過N/K,則「溢出」到下一個桶(也被排序,因此總是前置)。

原則上,知道數字N和K,那麼桶的大小應該很容易計算。隨着Spark的發展,您可能需要考慮基於排序的混洗(herehere),在那裏我瞭解維護人員已經得到顯着改進(並進行了重大優化)。這可能就像使用這個工具分區到K分區一樣簡單! :-)