首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否可以在PigLatin中创建不带COGROUP的嵌套FOREACH?

是否可以在PigLatin中创建不带COGROUP的嵌套FOREACH?
EN

Stack Overflow用户
提问于 2013-03-12 00:50:36
回答 2查看 698关注 0票数 0

我想像这样使用FOREACH:

代码语言:javascript
运行
复制
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循环内完成此操作?

EN

回答 2

Stack Overflow用户

发布于 2013-03-19 23:02:16

根据过滤的具体情况,您可以在ab中设计一组有限的互不相交的元素类,然后对这些元素进行JOIN。例如:

如果您的过滤规则

  • 如果a_attr以"Foo“开头且b为4,则接受
  • 如果a_attr以"Bar”开头且b大于17,则接受
  • 如果a_attr以m-z字母开头且b小于0,则accept
  • otherwise,reject

然后,您可以编写一个UDF,它将为满足第一条规则的项返回1,为第二条规则返回2,为第三条规则返回3,否则返回NULL。然后,您的CROSS/FILTER将变为

res = JOIN a BY myUDF(a), b BY myUDF(b);

Pig丢弃JOIN中的空值,因此只通过满足筛选条件的对。

票数 2
EN

Stack Overflow用户

发布于 2013-03-19 21:06:57

CROSS生成每个关系中所有元组的叉积。因此,不需要嵌套FOREACH。只需执行CROSS,然后执行FILTER

代码语言:javascript
运行
复制
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问题。被过滤的记录将永远不会被写入。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15344075

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档