Google cloud dataflow Google数据流组合添加输入失败

Google cloud dataflow Google数据流组合添加输入失败,google-cloud-dataflow,apache-beam,Google Cloud Dataflow,Apache Beam,使用googledataflow的pythonsdk 我已经重写了CombineFn以进行多字段聚合,而不是一次聚合一个字段。根据文档,添加_输入的接口是分组后的中间聚合和输入值。例如: 假设 ID1100 ID1200 ID1300 ID2100 ID2300 ID2400 我对add_输入函数的第二次调用应该接收(100,)和(200,)作为当前聚合和要添加到累加器的新值。此功能在本地runner场景中运行良好 当我转到GoogleDataflowEngine时,我看到一组具有上述条件的日志

使用googledataflow的pythonsdk 我已经重写了CombineFn以进行多字段聚合,而不是一次聚合一个字段。根据文档,添加_输入的接口是分组后的中间聚合和输入值。例如: 假设 ID1100 ID1200 ID1300 ID2100 ID2300 ID2400

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

当我转到GoogleDataflowEngine时,我看到一组具有上述条件的日志,其中完成了id1和id2的聚合。然后我突然看到另一个add_输入调用,中间_值与输入值(200,)进行分配,而输入_值与前面计算中的聚合值进行分配

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

总结如下:

进一步分析后,似乎正在使用同一个键的两组中间聚合调用add_输入。根据接口,它应该是中间聚合+此过程中的输入值

进一步分析后,似乎正在使用同一个键的两组中间聚合调用add_输入。根据接口,它应该是中间聚合+此过程中的输入值

听起来像是从
merge\u累加器
函数调用
add\u input
。 查看您的
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

是的,Alex,我确实在从merge input调用add_输入以重用计算逻辑。我必须解析输入值以适应add_输入函数所需的格式。谢谢你的回复。