我有猪数据文件
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
。
答案 0 :(得分:1)
与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;
答案 1 :(得分:0)
这有点像黑客,但这是你需要遵循的步骤。这些都可以在连续的FOREACH
中完成,甚至可以嵌套以节省空间 - 这里没有减少阶段。
STRSPLIT(values, ',') AS tup
TOBAG(tup.$0, tup.$1, tup.$2, tup.$3) AS bag
MIN(bag) AS min
请注意,这要求每个字符串中的值的数量是不变的。如果不是这种情况,你需要编写一个产生包的UDF(甚至是最小的,取决于你想要制作它的一般程度)。