基于包中的位置标记元素并使用最大值提取元素的名称

时间:2015-07-21 17:48:40

标签: apache-pig

我已经把手套分成了一个袋子:

FOREACH sampleData GENERATE $0, (bag{tuple()}) TOBAG($1..) AS samples:bag{t:tuple()};

我知道如何找到最大值:

sampleMax = FOREACH sampleOfData GENERATE $0, MAX(samples);

但是我想说“subelement_1”如果最大值是袋子的参数$ 0。问题是袋子大小没有必要一致。

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:1)

基本上你需要一个考虑重复的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为零索引。