2012-08-13 72 views
2

我使用Hadoop豬(0.10.0)來處理日誌文件,日誌行看起來像:豬:解析線空白符

2012-08-01 INFO (User:irim) getListedStocksByMarkets completed in 7041 ms 

我想獲得通過拆分令牌的關係空白,那就是:

(2012-08-01,INFO,(User:irim),getListedStocksByMarkets,completed,in,7041,ms

加載與聲明的數據:

records = LOAD 'myapp.log' using PigStorage(' ');

沒有達到這個目的,因爲我的令牌可以被幾個空白區分開,導致幾個空的令牌。 PigStorage似乎不支持正則表達式分隔符(或者至少我沒有成功配置它)。

所以我的問題:什麼是獲得這些令牌的最佳方式?

如果我可以從一個關係中刪除空元素,我會很高興,可以用Pig來做到這一點嗎?

例如從開始:

(2012-08-01,,,INFO,,,(User:irim),,getListedStocksByMarkets,completed,in,7041,ms

要獲得

(2012-08-01,INFO,(User:irim),getListedStocksByMarkets,completed,in,7041,ms

我試圖用TextLoader然後TOKENIZE另一種方法,但我不知道這是最好的戰略。 也許用戶負載是一個功能比較自然的選擇......

問候,

喬爾

回答

2

您可以使用內置的功能STRSPLIT用正則表達式來打破行成一個元組。下面是一個以逗號爲分隔符的特定示例腳本:

inpt = load '~/data/regex.txt' as (line : chararray); 
dump inpt; 
-- 2012-08-01,,,INFO,,,(User:irim),,getListedStocksByMarkets,completed,in,7041,ms 

splt = foreach inpt generate flatten(STRSPLIT(line, ',+')); 
dump splt; 
-- (2012-08-01,INFO,(User:irim),getListedStocksByMarkets,completed,in,7041,ms) 
+0

它的工作原理,謝謝! 我傾向於認爲用戶負載函數會更有效率,您是否同意? – 2012-08-14 08:34:08

+0

是的,它會的。好處是:將數據格式從豬腳本中分離出來,與AS集成(列......)。 – alexeipab 2012-08-14 09:59:23

+0

然後,我要使用該方法,再次感謝。 – 2012-08-14 11:43:54