根据包中的位置标记元素并使用 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
是零索引。
我已经把二人组分成了一个袋子:
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
是零索引。