是否可以在PigLatin中创建没有COGROUP的嵌套FOREACH?

问题描述:

我想使用foreach这样的:是否可以在PigLatin中创建没有COGROUP的嵌套FOREACH?

a:{a_attr:chararray} 
b:{b_attr:int} 

FOREACH a { 
    res = CROSS a, b; 
    -- some processing 
    GENERATE res; 
} 

我的意思,以便作出对a每个元素的跨产品与b所有元素,然后进行一些自定义的过滤和返回记录。

== ==编辑

定制filetering = res_filtered = FILTER资源BY ...; GENERATE res_filtered。

== EDIT-2 == 如何使用嵌套的CROSS做到这一点,没有事先GROUP或COGROUP的FOR循环内没有更多?

+0

你能提供更多的细节吗?我不太确定你想要完成什么。这种“自定义过滤”是什么样的处理? – 2013-03-18 20:41:16

+0

也许一些样本输入和输出将有助于澄清。 – 2013-03-18 20:48:01

+0

但是在这种情况下'CROSS'是什么意思?您一次只处理一个“a”的单个记录。我会发布一个我认为你想要的答案,但我可能仍然错过了一些东西。 – 2013-03-19 12:59:59

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后,你不应该有(不必要的)过度IO从CROSS过滤之前写的整个跨产品到磁盘的麻烦。被过滤的记录永远不会被写入。

+0

我知道CROSS是做什么的。我的问题是由于在大数据集上执行普通交叉的高昂代价(参见a和b有大约200万个元组)。这样,一个简单的CROSS就会在完成一半的操作之前吃掉我所有的磁盘空间。所以,我不会接受你的回答。 – 2013-03-19 13:40:16

+0

你有没有尝试过?我会猜想在'CROSS'之后立即使用'FILTER'会抑制所有这些元组写入磁盘。当然,如果你的过滤不是非常积极,你可能有太多的元组来写。但是,一次只处理一个“a”的记录是无法解决的。 – 2013-03-19 14:27:20

+0

情况就是这样。我想我的过滤将是积极的消除所有结果元组中的.9999。 – 2013-03-19 14:38:29

根据您筛选的具体情况,你可以设计一组有限的不相交类元素的ab,然后在这些JOIN。例如:

如果你的过滤规则

  • 如果a_attr开始与“富”和b是4,接受
  • 如果a_attr开始与“酒吧”和b大于17,接受
  • 如果a_attr开始于一个字母[MZ]和b小于0,接受
  • 否则,拒绝

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

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

猪在JOIN露珠空值,所以只能满足筛选条件对将被通过。

+0

在这种情况下,我会用SPLIT完成它。试试别的东西 – 2013-03-19 15:24:11

+0

你试试别的。我无法理解你所尝试过的或者他们不会为你工作的理由。如果您想获得有用的答案,您的问题需要更多信息。 – 2013-03-19 15:44:13

+0

我的问题非常精确:我问如何在没有事先GROUP或COGROUP的FOR循环中嵌套CROSS。 – 2013-03-19 15:48:31