繁体   English   中英

如何为 Python 中的 Apache Beam 制作有用的侧面输入? AsDict object 不可下标?

[英]How do I make a useful side input I can access for Apache Beam in Python? AsDict object not subscriptable?

好消息,我使用的是批处理,而不是流式传输。 我仍然不明白发生了什么。 显然 pvalue.AsDict() 实际上并没有给你一个 dict 值? 只是一个 PCollection 的包装器。 我怎么能把它变成一个字典,这样我就可以使用它了?

此代码在init方法上失败,就在我尝试访问操作时,就好像它是...字典一样。

错误是

File "[path]", line 40, in process
    location_indexes = [x[0] for x in self.operations["lookup_location_id"]]
TypeError: 'AsDict' object is not subscriptable [while running 'ParDo(Locations)']

这是罪魁祸首

class Locations(beam.DoFn):  # Location_ID
    def __init__(self, operations: dict):
        self.locations: list = operations["lookup_location_id"]

    def process(self, element: str):
        # I have code here, not relevant

这就是我所说的位置...

locations = (
            csv_data
            | beam.ParDo(Locations(operations=beam.pvalue.AsDict(operations)))
            | "Dedup locations" >> beam.Distinct()
        )

操作是一个元组的集合。 这是管道:

operations = (
            transforms
            | ParDo(Semantics(headers))
            | GroupByKey()

headers 实际上是一个普通的 ol' 列表。 所以这很适合作为 SideInput。 语义给我一些元组。

class Semantics(beam.DoFn):
    def __init__(self, headers: list):
        self.headers = headers

    def process(self, element: list):
        key = element[0]
        value: list = [self.headers.index(element[2]), element[3]]
        yield key, value

我还查看了调试器中的 AsDict 操作 object。 这是一团糟,我不知道我应该如何从中提取真正的价值。 任何人都可以帮忙吗?

DoFn class 的__init__部分在创建时运行,因此您无法获取从侧面输入生成的数据。

您需要做的是将侧面输入视图传递给process方法。 用我自己的例子:

class ChangeCurrency(beam.DoFn):    
    def process(self, value, ratios):
        current = value["currency"]
        exchanged = {"Original": current}
        for key in ratios[current]:
            exchanged[key] = value["amount"] * ratios[current][key]
        return [exchanged]  


{..}
pipeline | ParDo(ChangeCurrency(), ratios=beam.pvalue.AsDict(rates_pc))

仅供参考,您不需要 class,您可以使用简单的 function:

def change_currency(value, ratios):
    current = value["currency"]
    exchanged = {"Original": current}
    for key in ratios[current]:
        exchanged[key] = value["amount"] * ratios[current][key]
    return [exchanged]

{..}

pipeline | ParDo(change_currency, ratios=beam.pvalue.AsDict(rates_pc))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM