如何在转换之间发送namedtuple?

时间:2018-12-25 11:54:07

标签: bonobo-etl

如何从一个Bonobo转换中发送出一个名为namedtuple的行?因此,在接收转换中,我可以对行数据进行字段级访问。

我现在使用字典在两次转换之间发送数据。但是它们有一个缺点:它们是易变的(如果您忘记在转换的输出中创建一个新的变量,可能会发生坏事情)。

我认为,简单地将一个字典替换为一个namedtuple就能解决问题,但是显然Bonobo不支持发送一个namedtuple。我读了一些有关context.set_output_fields [keys list]的内容,但不知道如何使用它。一个小例子就好了!

1 个答案:

答案 0 :(得分:0)

使用namedtuple非常简单,您可以生成一个namedtuple实例,并将其作为下一个转换输入扩展检索:

import bonobo
import collections

Hero = collections.namedtuple("Hero", ["name", "power"])


def produce():
    yield Hero(name="Road Runner", power="speed")
    yield Hero(name="Wile E. Coyote", power="traps")
    yield Hero(name="Guido", power="dutch")


def consume(name, power):
    print(name, "has", power, "power")


def get_graph():
    graph = bonobo.Graph()
    graph >> produce >> consume
    return graph


if __name__ == "__main__":
    with bonobo.parse_args() as options:
        bonobo.run(get_graph())

将从命名元组字段中设置produce()的“输出字段”,并从第一行输入中检测到consume(...)的“输入字段”。

context.set_output_fields(...)方法仅在出于某种原因而不希望使用命名数据结构(例如namedtuple)但更喜欢使用元组而又需要在元组中命名值的情况下有用。

希望有帮助!