PIG提取物来自多个数字

时间:2014-08-08 14:28:18

标签: apache-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 个答案:

答案 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中完成,甚至可以嵌套以节省空间 - 这里没有减少阶段。

  1. 将字符串拆分为值元组,如您所做:STRSPLIT(values, ',') AS tup
  2. 将元组的元素放入包中:TOBAG(tup.$0, tup.$1, tup.$2, tup.$3) AS bag
  3. 像往常一样计算分钟:MIN(bag) AS min
  4. 请注意,这要求每个字符串中的值的数量是不变的。如果不是这种情况,你需要编写一个产生包的UDF(甚至是最小的,取决于你想要制作它的一般程度)。