我可以修改 apache beam 转换中的元素吗?

Can I modify elements within an apache beam transform?

Apache Beam programming guide 包含以下规则:

3.2.2. Immutability

A PCollection is immutable. Once created, you cannot add, remove, or change individual elements. A Beam Transform might process each element of a PCollection and generate new pipeline data (as a new PCollection), but it does not consume or modify the original input collection.

这是否意味着我不能、不得或不应该修改自定义转换中的单个元素? 具体来说,我正在使用 python SDK 并考虑将字典 {key: "data"} 作为输入的转换情况,进行一些处理并添加更多字段 {other_key: "some more data"}。 我对上面规则 3.2.2 的解释是我应该这样

def process(self,element):
    import copy
    output = copy.deepcopy(element)
    output[other_key] = some_data
    yield output

但我想知道这是否有点矫枉过正。

使用 TestPipeline,我发现如果我在 process() 方法中对它们进行操作,输入集合的元素也会被修改(除非元素是基本类型,如 int、float、bool.. .).

改变元素是否被认为是绝对不行的,或者只是一种必须小心的做法?

改变元素是绝对不行的,它可能而且将会导致违反 Beam 模型语义,即导致不正确和不可预测的结果。 Beam Java direct 运行ner 故意检测突变并使执行此操作的管道失败 - 这尚未在 Python 运行ner 中实现,但它应该是。

其原因主要是融合。例如。假设两个 DoFn 应用于同一个 PCollection "C"(f(C) 和 g(C) - 而不是 f(g(C))),并且 运行ner 将它们调度到 运行 在同一个分片中。想象一下,第一个 DoFn 修改了元素,然后到第二个 DoFn 运行 时,元素已经被更改——即第二个 DoFn 并没有真正应用于 "C"。在许多其他情况下,突变会导致不正确的结果。