2013-10-24 64 views
0

我有一個樣本數據看起來像:foreach如何在Pig中工作?

1950,0,1 
1950,22,1 
1950,-11,1 
1949,111,1 
1949,78,1 

和我用下面的命令:

A = load 'path/to/the/sample'; 
    B = foreach A generate $0,$1; 

應該只生成A. 然後我用

describe B 
的第一列2

檢查它是如何工作的,它返回:B:{a:bytearray,b:bytearray},這是正確的。

然而,當我運行命令

dump B 

爲什麼它返回:

(1950,0,1,) 
(1950,22,1,) 
(1950,-11,1,) 
(1949,111,1,) 
(1949,78,1,) 

的結果???真是太奇怪了。我試了幾次......但仍然是相同的結果

回答

2

發生這種情況的原因是因爲Pig默認嘗試通過製表符分隔數據。所以,當你傳遞一個這樣一行

1950,0,1 

它認爲它已經發現只是一個單一的領域,1950,0,1。由於您表示每行都有兩個字段,因此第二個字段只設置爲NULL

所以,當你GENERATE您加載的兩個領域,它打印出來的元組

(1950,0,1,) 

如果你要STORE這個,而不是DUMP荷蘭國際集團它,你會更清楚地看到它。豬將存儲由標籤(再次,默認)分離數據,並輸出文件看起來像

1950,0,1  
1950,22,1  
1950,-11,1  
1949,111,1  
1949,78,1  

這不是很受啓發,所以看起來反而會發生什麼,如果你要做到這一點:

B = foreach A generate $0, "test"; 
store B into 'output'; 

現在output數據將

1950,0,1 test 
1950,22,1 test 
1950,-11,1 test 
1949,111,1 test 
1949,78,1 test 

您可以控制豬使用的域分隔兩LOADSTORE通過使用條款USING PigStorage(',')PigStorage的參數可以是您喜歡的任何字符。另一個常見的是USING PigStorage('\n'),它將作爲一個整體加載到每行中。

2

使用PigStorage您的Load語句中的子句。

A = load 'path/to/the/sample' using PigStorage(','); 

B = foreach A generate $0,$1; 

dump B 

現在你會得到的結果是什麼ü希望

(1950,0)

(1950,22)

(1950,-11)

( 1949,111)

(1949,78)