2016-03-21 34 views
0

我想在一個簡單的csv文件上運行一個簡單的豬腳本,我不能讓FILTER做我想做的。我有一個test.csv文件看起來像這樣:我有一個看似簡單的豬生成,然後過濾問題

john,12,44,,0 
bob,14,56,5,7 
dave,13,40,5,5 
jill,8,,,6 

這裏是我的腳本不工作:

people = LOAD 'hdfs:/whatever/test.csv' using PigStorage(','); 
data = FOREACH people GENERATE $0 AS name:chararray, $1 AS first:int, $4 AS second:int; 
filtered = FILTER data BY first == 13; 
DUMP filtered; 

當我轉儲數據,一切都看起來很不錯。按預期得到名稱和第一個和最後一個整數。當我描述數據,一切都看起來很不錯:

data: {name: bytearray,first: int,second: int} 

當我嘗試通過第一個值是13篩選出的數據,我什麼也沒得到。過濾DUMP不會返回任何內容。奇怪的是,如果我將其更改爲第一個> 13,則所有「行」都將打印出來。

然而,這個腳本工作:

peopletwo = LOAD 'hdfs:/whatever/test.csv' using PigStorage(',') AS (f1:chararray,f2:int,f3:int,f4:int,f5:int); 
datatwo = FOREACH peopletwo GENERATE $0 AS name:chararray, $1 AS first:int, $4 AS second:int; 
filteredtwo = FILTER datatwo BY first == 13; 
DUMP filteredtwo; 

是什麼(爲此事或數據和datatwo)filteredtwo和過濾的區別?我想知道爲什麼使用GENERATE(即數據)獲得的新關係不會按照預期的那樣在第一個腳本中過濾。

回答

1

在下面指定

people = LOAD 'test5.csv' USING PigStorage(',') as (f1:chararray,f2:int,f3:int,f4:int,f5:int); 
filtered = FILTER people BY f2 == 13; 
DUMP filtered; 

輸出

equals

在負載itself.See數據類型更換過濾器使用>給出

filtered = FILTER people BY f2 > 13; 

輸出

greater

編輯

當從字節組你必須明確地投在FOREACH.This領域作品的價值轉換。

people = LOAD 'test5.csv' USING PigStorage(','); 
data = FOREACH people GENERATE $0 AS name:chararray,(int)$1 AS f1,(int)$4 AS f2; 
filtered = FILTER data BY f1 == 13; 
DUMP filtered; 
+0

這確實解決了我提出的確切問題,但我想我的問題比這個更通用。爲什麼生成的關係不適用於過濾器?這真的是我有興趣知道的。 – John

+0

你的豬的版本是什麼?資料來源:http://chimera.labs.oreilly.com/books/1234000001811/ch04.html#schemas應該指出的是,在Pig 0.8和更早的版本中,這個運行時適配代碼大部分不穩定並且經常失敗。在0.9中,大部分已經被修復。但是,如果您使用Pig的舊版本,則可能需要明確投射數據才能獲得正確的結果。 –

+0

我使用的是版本0.15.0。它感覺像某種模式失敗,因爲第一個> 13返回第一個腳本中的所有結果。就好像這些值出於某種原因沒有得到正確的整數值。這是一個非常奇怪的錯誤,一天中的大部分時間都一直困擾着我。就像你說的那樣,修正只是爲初始加載提供一個模式,但我寧願不要被迫這樣做。 – John

相關問題