我有一个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
在文件中。
2条答案
按热度按时间yptwkmov1#
类似于winnie的答案,但它很健壮,即它可以处理第二列的可变大小。您可以从datafu lib使用transposetupletobag udf(http://datafu.incubator.apache.org/docs/datafu/1.1.0/datafu/pig/util/transposetupletobag.html)
tzdcorbm2#
这有点像黑客,但以下是你需要遵循的步骤。这些都可以连续完成
FOREACH
s、 甚至嵌套以节省空间——这里没有reduce阶段。将字符串拆分为一个值元组,如下所示:
STRSPLIT(values, ',') AS tup
将元组的元素放入一个包中:TOBAG(tup.$0, tup.$1, tup.$2, tup.$3) AS bag
照常计算最小值:MIN(bag) AS min
请注意,这要求每个字符串中的值数是常量。如果不是这样,您将需要编写一个生成包的udf(甚至是最小值本身,这取决于您想要使它变得多么通用)。