2013-03-11 83 views
0

我想使用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

回答

1

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

2

根據您篩選的具體情況,你可以設計一組有限的不相交類元素的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

相關問題