我有一组整数值,我想将它们分组到一堆垃圾箱中。
示例:假设我在 1 到 1000 之间有一千个点,我想做 20 个分箱。
反正有没有将它们分组到一个 bin/array 中?
另外,我不会提前知道范围有多宽,所以我不能硬编码任何特定的值。
我有一组整数值,我想将它们分组到一堆垃圾箱中。
示例:假设我在 1 到 1000 之间有一千个点,我想做 20 个分箱。
反正有没有将它们分组到一个 bin/array 中?
另外,我不会提前知道范围有多宽,所以我不能硬编码任何特定的值。
如果您有最小值和最大值,则可以将范围除以箱数。例如,
-- 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
脚本背后的想法是,我们可以将范围[MIN, MAX]
除以 BIN_COUNT 以获得每个 bin: 的大小(MAX - MIN + 1) / BIN_COUNT
,称为 BIN_SIZE。然后我们将 id 映射到 bin number: (id - MIN) / BIN_SIZE
,并将它们分组。