2013-06-23 77 views
3

我有一組整數值,我想將它們組合成一堆箱子。豬:按範圍/裝箱數據分組

例如:假設我有1000到1000之間的點數,我想要做20個垃圾箱。

無論如何將它們分組到一個bin /數組?

此外,我不會提前知道範圍有多寬,所以我無法對任何特定值進行硬編碼。

+0

您可以先計算您的輸入數據的最小值和最大值,然後進行小組工作? – zsxwing

+0

我可以做到這一點,所以是從最小和最大是好的開始 –

回答

8

如果您有最小值和最大值,可以將範圍除以箱的數量。例如,

-- foo.pig 
ids = load '$INPUT' as (id: int); 
ids_with_key = foreach ids generate (id - $MIN) * $BIN_COUNT/($MAX- $MIN + 1) as bin_id, id; 
group_by_id = group ids_with_key by bin_id; 
bin_id = foreach group_by_id generate group, flatten(ids_with_key.id); 
dump bin_id; 

然後你可以用下面的命令來運行它:

pig -f foo.pig -p MIN=1 -p MAX=1000 -p BIN_COUNT=20 -p INPUT=your_input_path 

劇本背後的想法是,我們可以通過BIN_COUNT劃分範圍[MIN, MAX]讓每一個箱子的大小:(MAX - MIN + 1)/BIN_COUNT,稱爲BIN_SIZE。然後我們將id映射到bin號碼:(id - MIN)/BIN_SIZE,並對它們進行分組。