我目前正在尝试为每个组创建一个连接字符串。该字符串应该是所有出现的字段的串联。
目前我的代码如下所示:
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;
}
问题是我绝对不知道每个组的不同字段的数量或它们包含的内容。我不知道如何替换 ?
并使其正常工作。
最佳答案
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
。
关于group-by - 连接 pig 的每个字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21004418/