2015-10-15 17 views
0

假設我有一個帶有3列a,b,c的豬的表。現在假設我想通過b == 4過濾表,然後用a對它進行分組。我相信這看起來像這樣。在過濾器後使用豬組語法中的前一個表

t1 = my_table; -- the table contains three columns a, b, c 
t1_filtered = FILTER t1_filtered by (
    b == 4 
); 
t1_grouped = GROUP t1_filtered by my_table.a; 

我的問題是,爲什麼不能把它看起來就像這樣:

t1 = my_table; -- the table contains three columns a, b, c 
t1_filtered = FILTER t1_filtered by (
    b == 4 
); 
t1_grouped = GROUP t1_filtered by t1_filtered.a; 

爲什麼你有過濾器之前引用的表?我試圖學習豬,我發現自己犯了很多錯誤。在我看來,t1_filtered應該等於一個只是t1的過濾版本的表。因此,一個簡單的團隊應該是有道理的,但我已經被告知你需要引用之前的表格。有誰知道幕後發生了什麼,爲什麼這是有道理的?此外,幫助命名這個問題也表示讚賞。

回答

0

你有去引用(。)的方式也是不正確的。這是應該的。

A = LOAD '/filepath/to/tabledata' using PigStorage(',') as (a:int,b:int,c:int); 
B = FILTER A BY a==1; 
C = GROUP B BY a; 

但是,您的取消引用(。)的方式也適用於某些情況。在引用像地圖,元組或包等複雜數據類型時,只能使用點(。)。如果我們使用點運算符來訪問正常的字段,它會期望一個標量輸出。如果它有多個輸出,那麼你會得到這樣的錯誤。

java.lang.Exception: org.apache.pig.backend.executionengine.ExecException: ERROR 0: Scalar has more than one row in the output. 1st : (1,2,3), 2nd :(2,2,2) 

您使用點運算符將只工作,如果你的group by的輸出只有一個輸出如果不是你將結束這個錯誤的方式。關係B不是一個複雜的數據類型,這是我們在group by子句中不使用任何解引用操作符的原因。

希望這回答你的問題。