2016-01-19 30 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,...}'。这假定累加器适合内存,并且可能具有不同的性能特征 - 在某些情况下更好,在其他情况下更糟糕。如果你想了解更多的细节,请把它分成一个单独的问题。 –