I have read through the Beam documentation and also looked through Python documentation but haven't found a good explanation of the syntax being used in most of the example Apache Beam code.
Can anyone explain what the _ , | , and >> are doing in the below code? Also is the text in quotes ie 'ReadTrainingData' meaningful or could it be exchanged with any other label? In other words how is that label being used?
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()syntax and turn it into aninfixoperator. For example taking something likea.plus(b)and making it possible to write syntax likea + b. Check out the__or__,__ror__, and__rrshift__function definitions in the source github.com/apache/beam/blob/master/sdks/python/apache_beam/…. SoMyPTransform | NextPTransformis really taking both of those PTransform objects and passing them as a list_partsto a new_ChainedPTransformobject, and if you__or__yet another PTransform, it flattens the nested lists. - Davos>>aka__rrshift__is effectively setting thelabelattribute of the PTransform but it doesn't just do something like Ptransform.label('new name') or Ptransform.label = 'new name', it seems more convoluted to me.'ReadEvalData' >> _ReadData(eval_data)is evaluated as returning a new_NamedPTransformobject with_ReadData(eval_data)initialized as theself.transformattribute and the string'ReadEvalData'is initialized as the label attribute by usingSuperto run the parent classPTransform's init method. - Davos__ror__is the same as__or__, they both end up as the pipe infix|but__ror__lets you define how to pipe other objects to aPTransformwhere those other objects don't have the pipe operator method defined. It kind of makes the pipe operator of the thing on the right still work from left-to-right. - DavosPTransforrm.apply(NextPTransform.apply(YetAnotherPTransform))but then you can always create new variables for each step. After all, it is lazily evaluated and it is not doing deep copies of data so there's no penalty. - Davos