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;