Google Dataflow CombineFn add_input失败

时间:2018-07-11 13:27:40

标签: google-cloud-dataflow apache-beam

使用Google Dataflow的python SDK 我已经重写了CombineBn来进行多字段聚合,而不是一次进行一个字段。根据文档,add_input的接口是中间聚合和分组后的输入值。例如: 假设     ID1,100     ID1,200     ID1,300     ID2,100     id2,300     id2,400

我对add_input函数的第二次调用应接收(100,)和(200,)作为当前聚合和要添加到累加器的新值。此功能在本地运行程序场景中运行良好。

当我转到google dataflow引擎时,我看到一组具有上述条件的日志,其中完成了id1和id2的汇总。然后无处不在,我看到另一个对add_input的调用,在上一次计算中,intermediate_value被分配了输入值(200,),而input_value被分配了聚合值。

当第一遍完成所有计算时,我无法理解第二组add_input调用的原因。有什么见识会有所帮助吗?

总结:

在进一步分析中,似乎add_input正在使用同一键的两组中间集合进行调用。根据接口,此通道中它应该是中间聚合+输入值。

1 个答案:

答案 0 :(得分:1)

  

在进一步分析中,似乎add_input正在使用同一键的两组中间集合进行调用。根据界面,此通行证应该是中间聚合+输入值。

听起来您正在从add_input函数调用merge_accumulators。 有助于查看您的CombineFn代码。

更重要的是,您的CombineFn步骤的最终输出正确吗?

这里是我的一个管道中的CombineFn,以防其他例子。

class MergeDictCombineFn(beam.core.CombineFn):
    """
    CombineFn function that merges all of the dictionaries from the previous step

    {'a': 1}, {'a': 2, 'b':1}, {'c': 1} -> {'a': 3, 'b':1, 'c': 1}
    """

    def _sum_up(self, elements, accumulator=None):
        accumulator = accumulator or self.create_accumulator()
        for obj in elements:
            for k, v in obj.iteritems():
                if k not in accumulator:
                    accumulator[k] = 0
                accumulator[k] += v
        return accumulator

    def create_accumulator(self):
        return {}

    def add_input(self, accumulator, element, *args, **kwargs):
        return self._sum_up(elements=[element], accumulator=accumulator)

    def add_inputs(self, accumulator, elements, *args, **kwargs):
        return self._sum_up(elements=elements, accumulator=accumulator)

    def merge_accumulators(self, accumulators, *args, **kwargs):
        return self._sum_up(elements=accumulators)

    def extract_output(self, accumulator, *args, **kwargs):
        return accumulator
相关问题