Apache pig PIG从多个数字中提取最小值

Apache pig PIG从多个数字中提取最小值,apache-pig,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; 此抛出无法推断org.apache.pig.builtin.MIN的匹配函数有多个或没有一个匹配。请使用显式转换。因为数字存储为文件中的

我有一个猪数据文件

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;

此抛出
无法推断org.apache.pig.builtin.MIN的匹配函数有多个或没有一个匹配。请使用显式转换。
因为数字存储为文件中的字符串
1,5,8,4

这有点像黑客,但以下是您需要遵循的步骤。这些都可以在连续的
FOREACH
s中完成,甚至可以嵌套以节省空间——这里没有reduce阶段

  • 将字符串拆分为一个值元组,如您所做的:
    STRSPLIT(值,,')作为tup
  • 将元组的元素放入一个包:
    TOBAG(tup.$0,tup.$1,tup.$2,tup.$3)作为包
  • 像往常一样计算最小值:
    min(行李)作为最小值

  • 请注意,这要求每个字符串中的值数保持不变。如果不是这样,您需要编写一个UDF来生成包(甚至是最小值本身,取决于您想使它变得多么一般)。

    与Winnie的答案类似,但它很强大,即它可以处理第二列的可变大小。您可以使用DataFu库()中的TransportSetupletoBag UDF

    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;