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

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

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

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

谢谢

最佳答案

CombineFns被限制为单个输出值,因为它允许系统进行附加的并行化:分别组合值的不同子集,然后将它们的中间结果组合成任意的树形缩减模式,直到为每个键生成单个结果值为止。

如果每个键的值都不适合内存(因此无法使用Jeremy建议的GroupByKey-ParDo模式),但是计算出的统计信息确实适合内存,那么您也可以执行以下操作:
(1)使用Combine.perKey()计算每天的统计信息
(2)使用View.asIterable()将它们转换为PCollectionViews。
(3)使用ParDo重新处理原始输入,该ParDo将统计信息作为辅助输入
(4)在该ParDo的DoFn中,让startBundle()接受侧面输入,并建立一个内存中的数据结构,将日期映射到可用于在processElement中进行查询的统计信息。

关于google-cloud-dataflow - 基于公共(public) key 的简单数据分析方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27675423/

10-10 22:50