2013-05-06 43 views
1

我在HDFS上有一個巨大的輸入,我想用Pig來計算幾個獨特的度量。爲了幫助解釋這個問題更容易,我假設輸入文件有以下模式:大型輸入的多個子集上的豬唯一計數

用戶名:chararray,dimensionA_key:chararray,dimensionB_key:chararray,dimensionC_key:chararray,活動:chararray,...

每記錄表示該用戶標識執行的活動。

根據活動字段中的值,此活動記錄將映射到1個或多個類別。總共有大約10個類別。

現在我需要爲每個活動類別計算不同維度組合(即A,B,C,A + B,A + C,B + C,A + B + C)的唯一用戶數。

執行此類計算的最佳實踐是什麼?

我嘗試了幾種方法。儘管我可以得到我想要的結果,但需要很長時間(即幾天)。我發現大部分時間都花在了地圖階段。它看起來像腳本試圖加載巨大的輸入文件,每次它試圖計算一個唯一的計數。有沒有辦法改善這種行爲?

我也試過類似於下面的東西,但它看起來像達到了單個減速器的內存蓋,只是卡在最後一個reducer步驟。

source = load ... as (userId:chararray, dimensionA_key:chararray, dimensionB_key:chararray, dimensionC_key:chararray, activity:chararray, ...); 
a = group source by (dimensionA_key, dimensionB_key); 
b = foreach a { 
    userId1 = udf.newUserIdForCategory1(userId, activity); 
    -- this udf returns the original user id if the activity should be mapped to Category1 and None otherwise 
    userId2 = udf.newUserIdForCategory2(userId, activity); 
    userId3 = udf.newUserIdForCategory3(userId, activity); 
    ... 
    userId10 = udf.newUserIdForCategory10(userId, activity); 
    generate FLATTEN(group), COUNT(userId1), COUNT(userId2), COUNT(userId3), ..., COUNT(userId10); 
} 
store b ...; 

謝謝。 T.E.

+0

爲了幫助你解決內存問題,請看http://stackoverflow.com/questions/11999268/how-to-handle-spill-memory-in-pig/12003713#12003713 – alexeipab 2013-05-07 15:34:14

回答

0

如果我明白你在找什麼,它可能是CUBE操作,它允許通過許多組合進行分組 - 可以在Pig 0.11中找到。

如果你不能使用Pig 0.11,你可以試着按每個排列和UNION分組結果。

相關問題