pig从多个数字中提取min

zf9nrax1  于 2021-06-21  发布在  Pig
关注(0)|答案(2)|浏览(360)

我有一个Pig的数据文件

a|1,5,8,4
b|2,6,7,3
c|12,9,6,13

我需要生成

a,1
b,2
c,6

我在努力

Result =  foreach Data generate 
          (chararray) id  as id,(long) MIN(STRSPLIT(values, ',')) as min_value;

这个扔 Could not infer the matching function for org.apache.pig.builtin.MIN as multiple or none of them fit. Please use an explicit cast. 因为数字存储为字符串 1,5,8,4 在文件中。

yptwkmov

yptwkmov1#

类似于winnie的答案,但它很健壮,即它可以处理第二列的可变大小。您可以从datafu lib使用transposetupletobag udf(http://datafu.incubator.apache.org/docs/datafu/1.1.0/datafu/pig/util/transposetupletobag.html)

result1 = FOREACH data GENERATE (chararray) id  as id, STRSPLIT(values, ',') as numbers;
result2 = FOREACH result1 GENERATE id, TransposeTupleToBag(numbers) as numbers;
result3 = FOREACH result2 GENERATE id, MIN(numbers) as min;
tzdcorbm

tzdcorbm2#

这有点像黑客,但以下是你需要遵循的步骤。这些都可以连续完成 FOREACH s、 甚至嵌套以节省空间——这里没有reduce阶段。
将字符串拆分为一个值元组,如下所示: STRSPLIT(values, ',') AS tup 将元组的元素放入一个包中: TOBAG(tup.$0, tup.$1, tup.$2, tup.$3) AS bag 照常计算最小值: MIN(bag) AS min 请注意,这要求每个字符串中的值数是常量。如果不是这样,您将需要编写一个生成包的udf(甚至是最小值本身,这取决于您想要使它变得多么通用)。

相关问题