2013-04-04 82 views
0

請幫助我.. ..真的很緊急..親愛的,即時消息堅持它自2個星期..打破了我的頭,但沒有結果。我是一個新手在明膠。 我有一個場景,我必須從csv文件過濾數據。 csv在hdfs上,並且有兩列。豬拉丁文問題

grunt>> fl = load '/user/hduser/file.csv' USING PigStorage(',') AS (conv:chararray, clnt:chararray); 
grunt>> dump f1; 
("first~584544fddf~dssfdf","2001") 
("first~4332990~fgdfs4s","2001") 
("second~232434334~fgvfd4","1000") 
("second~786765~dgbhgdf","1000) 
("second~345643~gfdgd43","1000") 

什麼,我需要做的是我需要的第一個「〜」符號之前和CONCAT與CSV文件的第二列的值只提取第一個字。此外,我需要將返回的連接結果分組,並計算這些類似行的數量,然後創建一個新的csv文件作爲輸出,其中將再次出現2列。第一列是連接值,第二列是行數。 即

("first 2001","2") 
("second 1000","3") 

等等。

我在這裏寫了代碼,但它只是不工作。我用過STRSPLIT。它將分割輸入csv文件第一列的值。但我不知道如何提取第一個拆分值。 代碼如下給出:

convData = LOAD '/user/hduser/file.csv' USING PigStorage(',') AS (conv:chararray, clnt:chararray); 

fil = FILTER convData BY conv != '"-1"'; --im using this to filter out the rows that has 1st column as "-1". 

data = FOREACH fil GENERATE STRSPLIT($0, '~'); 

X = FOREACH data GENERATE CONCAT(data.$0,' ',convData.clnt); 

Y = FOREACH X GROUP BY X; 

Z = FOREACH Y GENERATE COUNT(Y); 

var = FOREACH Z GENERATE CONCAT(Y,',',Z); 

STORE var INTO '/user/hduser/output.csv' USING PigStorage(','); 
+0

嘿,你[讓我困惑這個問題](https://en.wikipedia.org/wiki/Pig_Latin)! – halfer

+1

順便提一下,我不建議強調幫助論壇上的緊急事項 - 如果你寫得很好,你會在這裏得到快速的幫助。請注意,如果他們看到這一點,有些人就會失望,因爲所有的幫助都是在志願者的閒暇時間裏:)。 – halfer

回答

1

STRSPLIT返回一個元組,其中可以訪問使用編號語法的單個元件。這是你需要的:

data = FOREACH fil GENERATE STRSPLIT($0, '~') AS a, clnt; 
X = FOREACH data GENERATE CONCAT(a.$0,' ', clnt); 
+0

認爲您需要將c1nt添加到第一行的末尾,並將CONCAT更改爲CONCAT(a。$ 0,'',clnt);因爲convData不是數據別名的一部分。 – DMulligan

+0

你是對的,我剛剛從問題中複製,並沒有仔細閱讀。 –

+0

也STRSPLIT($ 0,'〜',2)會更有效率,因爲你真的只需要第一個〜之前和之後的所有東西。這也可以讓他定義數據的模式,因爲現在STRSPLIT返回一個固定長度的2個字符串的元組......我嘗試在豬中只使用強類型模式,否則我發現自己陷入了難以調試的問題。 – DMulligan