我正在使用Dataflow进行一些机器学习预计算。我的问题是我在PCollection data
中有一个数据集(比如高维向量空间中的一个点数组),我想计算所有成对距离。我正在试图找出一种在PCollection中对夫妻进行某些操作的方法,到目前为止我已经想出了以下内容:
如果我也将所有数据放在一个数组data_array=[x_1,...,x_n]
中,我认为可以通过为data_array
的所有元素启动转换来完成,如
([ data | myTransformHere(point) for point in data_array ]
| <more code> )
(我不确定它是否有效,但我在CoGroupByKey
的代码中找到了类似的语法)
现在的问题是我必须从PCollection data_array
生成数组data
。我可以使用
pdict = data | beam.transforms.combiners.ToDict()
现在pdict只有一个元素,这是一个我可以轻松生成数组的字典。
但是,我不知道如何将pdict的单个值加载到内存中以生成更多变换。我应该做一个ParDo
并让它处理变换的产生(我事先知道data_array的大小,所以事先知道要使用的变换数)。但我不确定该怎么做。
有什么建议吗?也许有一种标准的方法可以同时对多个PCollections进行复杂的操作?
更新:我找到了解决问题的方法:我输出每个数据元素作为beam.Map的侧输出,然后将每个输出作为侧输入(AsSingleton)传递给转换为主输入原始数据并计算原始数据的每个点与侧输入之间的距离。
然而,通过观察性能,我认为这是次优的,因为它的计算时间超过23小时,而且操作是高度可并行化的(唯一真正的成本是内存)。也许输出单例并将它们作为副输入传递是错误的?