我已经通读了 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))
Python 中的运算符可以重载。在 Beam 中,
|
是 apply
的同义词,它将 PTransform
应用于 PCollection
以生成新的 PCollection
。 >>
允许您命名一个步骤,以便更轻松地在各种 UI 中显示 - |
和 >>
之间的字符串仅用于这些显示目的并标识该特定应用程序。
参见 https://beam.apache.org/documentation/programming-guide/#transforms
没有人提到
_
,所以只是为了完整起见:
_
没有什么官方特别,但将返回但您不关心的 变量分配给
_
被认为是一种很好的做法。这使得代码的读者很明显地知道你打算扔掉它。
_
的其他实例。
_
有一个非官方角色:因为它是“一次性”变量,所以大多数 linter 和其他代码清晰度助手会以不同的方式对待它。
use_me
并且从未实际使用它,则 linter 会警告您有一个未使用的变量。如果您有严格的代码质量限制,也许您甚至无法使用未使用的变量将代码合并到生产中。
_
不会被 linter 捕获(并且可以合并到严格的代码库中),因为它被理解为一次性变量,因此您的代码中没有错误(至少在这方面没有错误) .