我想像这样使用FOREACH:
a:{a_attr:chararray}
b:{b_attr:int}
FOREACH a {
res = CROSS a, b;
-- some processing
GENERATE res;
}我的意思是为a的每个元素生成一个包含b的所有元素的叉积,然后执行一些自定义筛选并返回元组。
==EDIT==
自定义过滤= res_filtered =过滤资源...;生成res_filtered。
==EDIT-2==如何使用嵌套的十字在没有之前的GROUP或COGROUP的FOR循环内完成此操作?
发布于 2013-03-19 23:02:16
根据过滤的具体情况,您可以在a和b中设计一组有限的互不相交的元素类,然后对这些元素进行JOIN。例如:
如果您的过滤规则
a_attr以"Foo“开头且b为4,则接受a_attr以"Bar”开头且b大于17,则接受a_attr以m-z字母开头且b小于0,则accept然后,您可以编写一个UDF,它将为满足第一条规则的项返回1,为第二条规则返回2,为第三条规则返回3,否则返回NULL。然后,您的CROSS/FILTER将变为
res = JOIN a BY myUDF(a), b BY myUDF(b);
Pig丢弃JOIN中的空值,因此只通过满足筛选条件的对。
发布于 2013-03-19 21:06:57
CROSS生成每个关系中所有元组的叉积。因此,不需要嵌套FOREACH。只需执行CROSS,然后执行FILTER
a: {a_attr: chararray}
b: {b_attr: int}
crossed = CROSS a, b;
crossed: {a::a_attr: chararray,b::b_attr: int}
res = FILTER crossed BY ... -- your custom filtering如果您的FILTER紧跟在CROSS之后,您应该不会因为CROSS在过滤之前将整个叉积写入磁盘而遇到(不必要的)过多IO问题。被过滤的记录将永远不会被写入。
https://stackoverflow.com/questions/15344075
复制相似问题