是否可以在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循环内没有更多?
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
过滤之前写的整个跨产品到磁盘的麻烦。被过滤的记录永远不会被写入。
我知道CROSS是做什么的。我的问题是由于在大数据集上执行普通交叉的高昂代价(参见a和b有大约200万个元组)。这样,一个简单的CROSS就会在完成一半的操作之前吃掉我所有的磁盘空间。所以,我不会接受你的回答。 – 2013-03-19 13:40:16
你有没有尝试过?我会猜想在'CROSS'之后立即使用'FILTER'会抑制所有这些元组写入磁盘。当然,如果你的过滤不是非常积极,你可能有太多的元组来写。但是,一次只处理一个“a”的记录是无法解决的。 – 2013-03-19 14:27:20
情况就是这样。我想我的过滤将是积极的消除所有结果元组中的.9999。 – 2013-03-19 14:38:29
根据您筛选的具体情况,你可以设计一组有限的不相交类元素的a
和b
,然后在这些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
露珠空值,所以只能满足筛选条件对将被通过。
在这种情况下,我会用SPLIT完成它。试试别的东西 – 2013-03-19 15:24:11
你试试别的。我无法理解你所尝试过的或者他们不会为你工作的理由。如果您想获得有用的答案,您的问题需要更多信息。 – 2013-03-19 15:44:13
我的问题非常精确:我问如何在没有事先GROUP或COGROUP的FOR循环中嵌套CROSS。 – 2013-03-19 15:48:31
你能提供更多的细节吗?我不太确定你想要完成什么。这种“自定义过滤”是什么样的处理? – 2013-03-18 20:41:16
也许一些样本输入和输出将有助于澄清。 – 2013-03-18 20:48:01
但是在这种情况下'CROSS'是什么意思?您一次只处理一个“a”的单个记录。我会发布一个我认为你想要的答案,但我可能仍然错过了一些东西。 – 2013-03-19 12:59:59