【发布时间】: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