![](/img/trans.png)
[英]How I can implement *asdict() or *asdict() using @dataclass
[英]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.