2016-01-19 26 views
0

我有下面提到的頭部數據。其中,1個組織具有n應用,1個應用具有n用戶(在不同的應用程序相同的用戶名是指不同的用戶):使用數據流執行嵌套聚合

org, app, users, spend_time 

現在,我需要找到每個用戶的總平均spend_time,每個應用程序和每個組織。

這樣做的最好方法是什麼?

P.S.我目前通過使(org,app,user)的關鍵字找到每個用戶平均花費時間(org,app)的關鍵字來找到每個應用的平均花費時間來解決此問題。

回答

2

您建議的方法是一個很好的方法。

如果要執行每個數據的任何子集的任何聚合(例如,總和)(例如,每個用戶),你會做以下幾點:

  • 鍵指定給每個元素,使得應該聚合的元素共享密鑰的相同值,不應聚合在一起的元素不共享相同的密鑰。
  • 調用每個鍵Combine變換。

這裏的每個關鍵Combine演示變換的部分代碼片段:

PCollection<KV<String, Double>> salesRecords = ...; 
PCollection<KV<String, Double>> totalSalesPerPerson = 
    salesRecords.apply(Combine.<String, Double>perKey(
     new Sum.SumDoubleFn())); 
+0

是否有可能進行多場組合在密鑰聚集操作的關鍵?目前我實施DoFn加入(組織,應用程序,用戶)來製作單個密鑰,然後執行聚合並拆分結果。 – Lionel

+1

我不確定你到底在問什麼。也許你想用'Combine'來計算你感興趣的所有三個聚合。如果是這樣,你必須編寫自己定製的'CombineFn'。累加器應該是這樣的:'{org-count,org-sum,地圖 app-count,地圖 app-sum,...}'。這假定累加器適合內存,並且可能具有不同的性能特徵 - 在某些情況下更好,在其他情況下更糟糕。如果你想了解更多的細節,請把它分成一個單獨的問題。 –