我正在使用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
我想要提供一些额外的参数arg1
和kwarg1
,这些参数是内部其他转换所需的。但是我不知道这是否是有效的方法,也不知道如何在管道中使用它。
有人可以指出我的方向吗?
答案 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的其他示例:(请参见PTransform
)https://beam.apache.org/releases/pydoc/2.20.0/_modules/apache_beam/transforms/stats.html
答案 1 :(得分:0)
通常,您无法如所描述的那样在运行时动态地将其他参数传递给转换。当您运行构造管道的控制器程序时,管道的结构将被序列化,发送,然后在无权访问您的控制器程序的一组工人中并行执行,他们只会得到结构和实际您的ParDos
的代码。
动态参数化执行的一种方法是提供额外的数据作为额外的输入,例如创建另一个填充了参数值的PCollection
,然后将其与主PCollection
连接起来。例如,使用side-inputs或CoGroupByKey
。
如果您正在查看Cloud Dataflow
,则可以考虑使用管道templates with ValueProviders
,但不确定在pyton或非Dataflow运行器中是否可用。