在猪的每个领域结束?

时间:2014-01-08 19:08:15

标签: group-by concatenation apache-pig

我目前正在尝试为每个组创建一个连接字符串。此字符串应该是字段所有出现的串联。

目前我的代码如下:

grouped = GROUP a by group_field;

b = FOREACH grouped {
    unique_field = DISTINCT myfield;
    tupl = TOTUPLE(unique_field) ; 
    FOREACH tupl GENERATE group as id, CONCAT( ? ) as my_new_string;
}

事情是我绝对不知道每个组的不同字段的数量或它们包含的内容。我不知道如何替换?并使其工作。

1 个答案:

答案 0 :(得分:3)

TOTUPLE没有做你期望的事情,它正在制作一个元素元组,其中一个元素是unique_field的包。

此外,CONCAT只需要两件事来连接,并且必须明确定义它们。假设你有一个类似A: {A1: chararray, A2: chararray, A3: chararray}的模式,你想要将所有字段连接在一起。你必须这样做(这显然不是理想的):CONCAT(CONCAT(A1, A2), A3)

无论如何,使用python UDF可以轻松解决此问题。

<强> myudfs.py

#!/usr/bin/python

@outputSchema('concated: string')
def concat_bag(BAG):
    return ''.join(BAG)

此UDF将在您的脚本中使用,如:

Register 'myudfs.py' using jython as myfuncs;

grouped = GROUP a by group_field;

b = FOREACH grouped {
    unique_field = DISTINCT myfield;
    GENERATE group as id, myfuncs.concat_bag(unique_field);
}

我刚注意到FOREACH tupl GENERATE ...行。这不是有效的语法。嵌套FOREACH中的最后一个语句应为GENERATE