【问题标题】:Explain Apache Beam python syntax解释 Apache Beam python 语法
【发布时间】:2017-10-03 09:50:42
【问题描述】:

我已通读 Beam 文档并查看了 Python 文档,但没有找到对大多数示例 Apache Beam 代码中使用的语法的良好解释。

谁能解释一下_|>>在下面的代码中做了什么?引号中的文本(即“ReadTrainingData”)是否有意义,或者可以与任何其他标签交换?换句话说,该标签是如何使用的?

train_data = pipeline | 'ReadTrainingData' >> _ReadData(training_data)
evaluate_data = pipeline | 'ReadEvalData' >> _ReadData(eval_data)

input_metadata = dataset_metadata.DatasetMetadata(schema=input_schema)

_ = (input_metadata
| 'WriteInputMetadata' >> tft_beam_io.WriteMetadata(
       os.path.join(output_dir, path_constants.RAW_METADATA_DIR),
       pipeline=pipeline))

preprocessing_fn = reddit.make_preprocessing_fn(frequency_threshold)
(train_dataset, train_metadata), transform_fn = (
  (train_data, input_metadata)
  | 'AnalyzeAndTransform' >> tft.AnalyzeAndTransformDataset(
      preprocessing_fn))

【问题讨论】:

  • 这个想法是采用.method() 语法并将其转换为infix 运算符。例如,采用 a.plus(b) 之类的东西,并可以编写类似 a + b 的语法。查看源代码github.com/apache/beam/blob/master/sdks/python/apache_beam/… 中的__or____ror____rrshift__ 函数定义。所以MyPTransform | NextPTransform 确实将这两个 PTransform 对象作为一个列表 _parts 传递给一个新的 _ChainedPTransform 对象,如果你 __or__ 又是一个 PTransform,它会使嵌套列表变平。
  • >> aka __rrshift__ 有效地设置了 PTransform 的 label 属性,但它不仅仅执行 Ptransform.label('new name') 或 Ptransform.label = '新名字”,这对我来说似乎更令人费解。 'ReadEvalData' >> _ReadData(eval_data) 被评估为返回一个新的_NamedPTransform 对象,其中_ReadData(eval_data) 初始化为self.transform 属性,字符串'ReadEvalData' 被初始化为标签属性,使用Super 运行父类PTransform' s init 方法。
  • __ror____or__ 相同,它们都以管道中缀| 结尾,但__ror__ 允许您定义如何将其他对象通过管道传递到PTransform,其中那些其他对象没有定义管道运算符方法。这有点让右边的东西的管道操作符仍然从左到右工作。
  • 极其复杂,以当前对象为属性创建一个新对象,只是为了获得功能/外壳样式的流程。不过,它确实可以更轻松地从左到右阅读整个处理管道,并且看起来类似于 F# 之类的函数式编程语法或在 Rlang 中使用 MagrittR。它可能比许多嵌套函数调用(如PTransforrm.apply(NextPTransform.apply(YetAnotherPTransform)))要好,但是您始终可以为每个步骤创建新变量。毕竟,它是懒惰评估的,它没有做数据的深拷贝,所以没有惩罚。

标签: python apache-beam


【解决方案1】:

Python 中的运算符可以重载。在 Beam 中,|apply 的同义词,它将PTransform 应用于PCollection 以产生新的PCollection>> 允许您命名一个步骤,以便在各种 UI 中更轻松地显示 - |>> 之间的字符串仅用于这些显示目的并标识该特定应用程序。

https://beam.apache.org/documentation/programming-guide/#transforms

【讨论】:

  • 谢谢!这很有帮助。如果我理解正确,那么他们是否使用 _ 因为 writeMetadata 转换没有输出 PCollection?
  • 理论上,它应该返回一个他们不需要的 PDone [1](所以他们使用一次性的 _)。 [1]github.com/apache/beam/blob/master/sdks/python/apache_beam/…
  • @JoelCroteau:我猜他们认为使用| 符号 - 通常是管道符号(例如在 shell 中) - 因为这会非常聪明,因为你正在构建管道......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-05
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
相关资源
最近更新 更多