如何为Apache Beam中的复合转换提供参数?

时间:2018-12-19 06:36:33

标签: python apache-beam

我正在使用Apache Beam的Python SDK。

我有一些转换步骤,并且希望使其可重用,这使我编写了一个定制的复合转换,如下所示:

class MyCompositeTransform(beam.PTransform):
def expand(self, pcoll, arg1, kwarg1=u'default'):
    result = (pcoll
              | 'Step 1' >> beam.Map(lambda f: SomeFn(f, arg1))
              | 'Last step' >> beam.Map(lambda f: SomeOtherFn(f, kwarg1))
              )
    return result

我想要提供一些额外的参数arg1kwarg1,这些参数是内部其他转换所需的。但是我不知道这是否是有效的方法,也不知道如何在管道中使用它。

有人可以指出我的方向吗?

2 个答案:

答案 0 :(得分:1)

您可以通过PTransform构造函数来提供参数。参数也可以采用侧面输入的形式(即,从另一个变换输出的数据)。这是一个同时使用“正常”参数和侧面输入的示例。

from typing import Dict, Any, Iterable
import apache_beam as beam


class MyCompositeTransform(beam.PTransform):

    def __init__(self, my_arg, my_side_input):
        super().__init__()
        self.my_arg= my_arg
        self.my_side_input= my_side_input

    @staticmethod
    def transform(
        element: Dict[str, Any], my_arg: int, my_side_input: Iterable[int]
    ) -> Dict[str, Any]:
        pass

    def expand(self, pcoll):
        return pcoll | "MyCompositeTransform" >> beam.Map(
            MyCompositeTransform.transform,
            self.my_arg,
            beam.pvalue.AsIter(self.my_side_input),
        )

使用beam.pvalue定义如何将侧面输入传递给变换,例如是单个值,Iterable还是具体化为List

Beam的其他示例:(请参见PTransformhttps://beam.apache.org/releases/pydoc/2.20.0/_modules/apache_beam/transforms/stats.html

答案 1 :(得分:0)

通常,您无法如所描述的那样在运行时动态地将其他参数传递给转换。当您运行构造管道的控制器程序时,管道的结构将被序列化,发送,然后在无权访问您的控制器程序的一组工人中并行执行,他们只会得到结构和实际您的ParDos的代码。

动态参数化执行的一种方法是提供额外的数据作为额外的输入,例如创建另一个填充了参数值的PCollection,然后将其与主PCollection连接起来。例如,使用side-inputsCoGroupByKey

如果您正在查看Cloud Dataflow,则可以考虑使用管道templates with ValueProviders,但不确定在pyton或非Dataflow运行器中是否可用。