我目前正致力于在Apache Spark 2.2上实现Cooley-Tukey快速傅立叶变换算法的radix-2版本。如果您不熟悉算法的工作原理,那么您真正需要知道的是,它需要将向量分解为完美的二叉树结构,然后将每对叶子组合成一个新的向量(像合并排序,但复杂的数学)。我想使用.treeAggregate函数在Spark中完成此操作。
问题是,在每个分区聚合中,组合/序列操作不考虑FFT算法所需的完美排序。例如,如果我有一个大小为8的向量,我将通过算法,我的算法需要按此顺序处理(每个数字代表原始向量中值的索引):
0 4 2 8 1 5 3 7
\ / \ / \ / \ /
0,4 2,8 1,5 3,7
\ / \ /
0,2,4,8 1,3,5,7
\ /
0,1,2,3,4,5,6,7
但是,聚合可以按任何顺序执行此操作,甚至可能不一定组合相同大小的矢量。那么我该怎么做:
您可以假设2个相同大小的分区的功率。原始矢量大小也是2的幂。我想过可能不会只使用treeAggregate并使用mapPartitions,然后在每个分区上调用aggregate,这样它们都有一个向量,然后调用treeAggregate。这可能会给予更多控制但仍然无法解决我的问题。除此之外,我不知所措。
编辑:我意识到合并排序类比和树可能是错误的。为了澄清,上面那棵树中的那些值必须是那个EXACT排序。矢量中的定位是该算法的主要部分。