我有一组整数值,我想分组成一堆垃圾箱。例如:假设我在1到1000之间有1000个点,我想做20个箱子。是否仍要将它们分组到一个bin/数组中?另外,我不会提前知道范围有多宽,所以我不能硬编码任何特定的值。
6xfqseft1#
如果你有最小值和最大值,你可以把范围除以箱子的数量。例如,
-- 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] 按箱子计数获得每个箱子的大小: (MAX - MIN + 1) / BIN_COUNT ,称为binu size。然后我们将idMap到bin编号: (id - MIN) / BIN_SIZE ,并将它们分组。
[MIN, MAX]
(MAX - MIN + 1) / BIN_COUNT
(id - MIN) / BIN_SIZE
1条答案
按热度按时间6xfqseft1#
如果你有最小值和最大值,你可以把范围除以箱子的数量。例如,
然后可以使用以下命令运行它:
剧本背后的想法是我们可以划分范围
[MIN, MAX]
按箱子计数获得每个箱子的大小:(MAX - MIN + 1) / BIN_COUNT
,称为binu size。然后我们将idMap到bin编号:(id - MIN) / BIN_SIZE
,并将它们分组。