2013-11-21 85 views
3

我的數據是這樣的:集聚行價值爲列

2013-11 localhost  kern 
2013-11 localhost  kern 
2013-11 192.168.0.59 daemon 
2013-12 localhost  kern 
2013-12 localhost  daemon 
2013-12 localhost  mail 

你的想法。我試圖上述按日期(作爲行鍵)基團並且具有對應於每個kern的計數,daemon等,總之一列,我期望的輸出應爲如下:

-- date, count(kern), count(daemon), count(mail) 
(2013-11, 2, 1, 0) 
(2013-12, 1, 1, 1) 

目前,我的方法是這樣的。

valid_records = FILTER formatted_records BY date is not null; 

date_group = GROUP valid_records BY date; 
facilities = FOREACH date_group { 
    -- DUMB way to filter for now :(
    kern = FILTER valid_records BY facility == 'kern'; 
    user = FILTER valid_records BY facility == 'user'; 
    daemon = FILTER valid_records BY facility == 'daemon'; 

    -- this need to be in order so it get mapped correctly to HBase 
    GENERATE group, COUNT(kern), COUNT(user), COUNT(daemon); 
} 

兩個問題:

  1. 我有3個過濾器上面,但在生產中,應該有比也許10過濾器的更多。如果我使用上面的許多FILTER,是否會有性能下降?

  2. 任何其他更好的方法來做到這一點?

回答

0

只要你有一組操作,你將有一個減少的階段,這意味着你很可能有寫臨時映射器輸出的開銷,二次排序等方面有其他的豬運營商觸發一個縮小階段,但我不認爲FILTER是其中之一:映射程序任務可以篩選輸入並創建多個輸出,然後排序併發送到單個縮小階段。

換句話說,在豬身上看起來很亂的東西實際上可能非常有效,看起來簡潔的東西可以產生比您預期的更多的地圖縮減開銷。

如果您從命令行運行豬作業,您將看到正在使用的操作符的摘要以及邏輯計劃生成的M/R作業的列表。

+0

謝謝,所以在這種情況下,mine會產生兩個reduce階段,一個是使用GROUP時,另一個是GENERATE最後的結果,不是?我認爲我可以有一個臨時映射器輸出,我只是擔心如果我有10個「過濾器」,它會有很大的性能影響。會有很多地圖階段也會降低性能?我需要每30分鐘運行一次。我無法想出任何其他方式來解決這個問題,以得到我的最終結果。但是,如果這足夠好,我就可以。 –

1

我認爲你的問題是你正在尋找一種浮動類型模式的輸出。但是,這一切似乎你所要做的就是按組合鍵: 這個腳本:

formatted_records = LOAD 'input' AS (date: chararray, host: chararray, facility: chararray); 
valid_records = FILTER formatted_records BY date is not null; 
counts = FOREACH (GROUP valid_records BY (date, facility)) GENERATE 
     group.date AS date, 
     group.facility AS facility, 
     COUNT(valid_records) AS the_count; 
DUMP counts; 

您將獲得:

(2013-11,kern,2) 
(2013-11,daemon,1) 
(2013-12,kern,1) 
(2013-12,mail,1) 
(2013-12,daemon,1) 

其中只給出相同的信息。

如果您想以類似於您的奇特方式格式化輸出,則最好使用通用語言(如Java或Python)分別執行此類任務(假設Pig的輸出足夠小以適應內存)。豬不擅長這一點。

+0

我可以這樣做,但問題是當我將數據存儲到HBase中時,它將被重寫/覆蓋,因爲它們具有相同的密鑰,即2013-11。我需要按年份和月份訪問數據,因此2013-11年是關鍵,所以我可以在相應的列中獲取所有信息。我對此很新,我來自RDBMS背景。我使用Java編寫自定義MR,但與Pig相比,Pig更容易管理。 –

+0

我的意思是你必須把一箇中間步驟放到你的管道中:豬繁重的工作 - >以你想要的方式格式化數據(豬的輸出)的Python/Java/etc腳本 - >將HBase /隨你。 – Ruslan