根据包中的位置标记元素并使用 max 提取元素名称

Labeling elements based on position in bag and extracting name of elements with max

我已经把二人组分成了一个袋子:

FOREACH sampleData GENERATE [=10=], (bag{tuple()}) TOBAG(..) AS samples:bag{t:tuple()};

而且我知道如何找到最大值:

sampleMax = FOREACH sampleOfData GENERATE [=11=], MAX(samples);

但我想说 "subelement_1" 如果最大值在包的参数 $0 中。问题是袋子尺寸不一定一致。

如有任何帮助,我们将不胜感激。

本质上,您需要一个考虑重复项的 argwhere() 函数。您可以为此使用 python UDF。

数据:

(K1,{(K1,0),(K1,4),(K1,4),(K1,1)})
(K2,{(K2,5),(K2,5),(K2,1),(K2,2)})

UDF:

@outputSchema("max_idx:(index:int)")
def argmax_idx(bag):
    try:
        nums = [x[1] for x in bag]
        m = max(nums)
        idxs = tuple([i for i in xrange(len(nums)) if nums[i] == m])
        return idxs

    except:
        return tuple(None)

脚本:

REGISTER 'argmax_idx.py' USING jython AS udf;

data = LOAD 'some_data';
A = FOREACH data GENERATE udf.argmax_idx(data);
DUMP A;

输出:

(K1, (1,2))
(K2, (0,1))

请注意 Pig 是零索引。