一个无界的PCollection怎么可能是不可变的



我刚开始使用dataflow/apachebeam,我正在努力理解一个概念。根据文件:

PCollection是T类型值的不可变集合。PCollection可以包含有界或无界数量的元素。

很容易理解有界PCollections是不可变的。你得到一个文件,你把它放在PCollection中,你不能更改它:不可变。

无界PCollections呢?根据定义,它们没有元素数量的限制,所以东西总是无限期地添加到它们中;也就是说,一件事怎么可能永远改变,又是不变的?

解释一下就好了。

这是个好问题!我相信编程指南比JavaDoc更好地解释了PCollection的不变性。不变性与单个元素有关:

PCollection是不可变的。一旦创建,就不能添加、删除或更改单个元素。Beam Transform可能会处理PCollection的每个元素并生成新的管道数据(作为新的PCollection(,但它不会消耗或修改原始输入集合。

注意:Beam SDK避免了不必要的元素复制,因此PCollection内容在逻辑上是不可变的,而不是物理上不可变的。对输入元素的更改可能对同一捆绑包中执行的其他DoFn可见,并可能导致正确性问题。通常,修改提供给DoFn的值是不安全的。

另一种看待它的方法是,集合在逻辑上是不可变的,只是你对它的看法随着时间的推移而变化(由于无法预见未来(。例如,ReadFromPubSub返回将发布到此主题的所有消息的(不可变的、无限制的(集合。从Beam API,您不能将此集合修改为PCollection,但您可以创建其他不可变的、无限制的PCollection

这类似于Haskell等函数语言中存在的懒惰的无限结构——你只能观察到它的一部分,但这并不意味着整个东西不作为一个不可变的对象存在。

相关内容

最新更新