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