【问题标题】:What do the "|" and ">>" means in Apache Beam?“|”是什么意思而“>>”在 Apache Beam 中是什么意思?
【发布时间】:2020-11-19 23:49:58
【问题描述】:

我正在尝试了解 Apache Beam。我在关注programming guide,在一个例子中,他们说谈论The following code example joins the two PCollections with CoGroupByKey, followed by a ParDo to consume the result. Then, the code uses tags to look up and format data from each collection.

我很惊讶,因为我在任何时候都没有看到ParDo 操作,所以我开始怀疑| 是否真的是ParDo。代码如下所示:

import apache_beam as beam
from apache_beam.options.pipeline_options import PipelineOptions

emails_list = [
    ('amy', 'amy@example.com'),
    ('carl', 'carl@example.com'),
    ('julia', 'julia@example.com'),
    ('carl', 'carl@email.com'),
]
phones_list = [
    ('amy', '111-222-3333'),
    ('james', '222-333-4444'),
    ('amy', '333-444-5555'),
    ('carl', '444-555-6666'),
]

pipeline_options = PipelineOptions()
with beam.Pipeline(options=pipeline_options) as p:
    emails = p | 'CreateEmails' >> beam.Create(emails_list)
    phones = p | 'CreatePhones' >> beam.Create(phones_list)
    results = ({'emails': emails, 'phones': phones} | beam.CoGroupByKey())
    
    def join_info(name_info):
        (name, info) = name_info
        return '%s; %s; %s' %\
      (name, sorted(info['emails']), sorted(info['phones']))

    contact_lines = results | beam.Map(join_info)

我确实注意到emailsphones 在管道开始时被读取,所以我猜他们两个是不同的PCollections,对吧?但是ParDo 在哪里执行? “|”是什么意思而“>>”实际上是什么意思?我怎么能看到这个的实际输出? join_info 函数、emails_listphones_list 是否在 DAG 外部定义有关系吗?

【问题讨论】:

    标签: python-3.x apache-beam


    【解决方案1】:

    | 表示步骤之间的分隔,这是(将p 用作Pbegin):p | ReadFromText(..) | ParDo(..) | GroupByKey()

    你也可以在|之前引用其他PCollections

    read = p  | ReadFromText(..)
    kvs = read | ParDo(..)
    gbk = kvs | GroupByKey()
    

    相当于前面的管道:p | ReadFromText(..) | ParDo(..) | GroupByKey()

    >>|PTransform 之间使用来命名步骤:p | ReadFromText(..) | "to key value" >> ParDo(..) | GroupByKey()

    【讨论】:

    • 除此之外,还有一些可用于学习 Beam 的教程,您可以通过创建一个新实例
    • 谢谢@Iñigo。所以,如果我理解得很好,ParDo 操作由>> 符号表示,而| 表示对PCollections 的不同转换,它们是串行执行的,对吧?在您发布的示例中,是否有必要使用ParDoParDo 是否在管道中开设新分支?
    • 不不,>> 只是一个可选的命名步骤。 pardos 本身就是一个PTransform。澄清一下:p | "optional name" >> Ptransform| 是一个分隔符。
    • 在该示例中,CreateCoGroupByKey(和 ParDo FWIW)是 PTransformsCreate 生成元素。 CoGroupByKey 是一种聚合 N PCollection 的方法。 ParDo 是一个元素到元素的通用操作(例如,对数字求平方、加一个或任何函数)。我强烈建议通过 Katas 或 Dataflow Notebooks 来获得正确的概念。我没有看过 Katas(但它们是 Beam 正式发布的),但我直接知道 Dataflow Notebooks 中有一些理论和基本概念。
    • 您可能还想通过Beam python transform catalog 并可能从更简单的转换开始(我会说CoGroupByKey 是最难的转换之一)
    猜你喜欢
    • 2011-08-12
    • 2017-06-11
    • 2018-03-05
    • 2023-03-27
    • 1970-01-01
    • 2016-08-17
    • 2010-12-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多