基于公共密钥分析数据的简单方法

时间:2014-12-28 10:08:55

标签: google-cloud-dataflow

处理映射到特定键的所有记录并输出该数据的多个记录的最简单方法是什么。

例如(合成示例),假设我的密钥是日期,值是带有测量温度的日内时间戳。我想在一天内将温度分类为高/平均/低(再次,低于/高于平均值1 stddev)。

输出将是原始温度及其新分类。

使用Combine.PerKey(CombineFn),每个键只允许使用#extractOutput()方法输出一个输出。

由于

2 个答案:

答案 0 :(得分:5)

CombineFns仅限于单个输出值,因为这允许系统进行额外的并行化:分别组合值的不同子集,然后将它们的中间结果组合成任意树减少模式,直到生成单个结果值为止每把钥匙。

如果每个键的值不适合内存(因此你不能使用Jeremy建议的GroupByKey-ParDo模式)但计算的统计数据确实适合内存,你也可以这样做: (1)使用Combine.perKey()计算每天的统计数据 (2)使用View.asIterable()将它们转换为PCollectionViews。 (3)用ParDo重新处理原始输入,ParDo将统计数据作为侧输入 (4)在ParDo的DoFn中,让startBundle()接受侧输入,并建立一个内存数据结构映射天数,以及可用于在processElement中进行查找的统计数据。

答案 1 :(得分:1)

为什么不使用GroupByKey操作后跟ParDo? GroupBy将使用给定键对所有值进行分组。然后应用ParDo允许您使用给定键处理所有值。使用ParDo,您可以为给定密钥输出多个值。

在你的温度示例中,GroupByKey的输出将是KV的PCollection< Integer,Iterable< Float>> (我假设您使用整数来表示温度的Day和Float)。然后,您可以应用ParDo来处理这些KV中的每一个。对于每个KV,您可以迭代表示温度的Float,并计算hi / average / low temperature。然后,您可以使用这些统计数据对每个温度读数进行分类,并输出表示分类的记录。这假设每天的测量数量足够小,以便容易适合记忆。