Spark高度可控的聚合

时间:2018-02-23 07:51:36

标签: scala apache-spark signal-processing fft distributed-computing

我目前正致力于在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

但是,聚合可以按任何顺序执行此操作,甚至可能不一定组合相同大小的矢量。那么我该怎么做:

  1. 在分区中制作聚合函数我需要的方法吗?
  2. 然后使treeAggregate函数在组合分区时需要它吗?
  3. 您可以假设2个相同大小的分区的功率。原始矢量大小也是2的幂。我想过可能不会只使用treeAggregate并使用mapPartitions,然后在每个分区上调用aggregate,这样它们都有一个向量,然后调用treeAggregate。这可能会给予更多控制但仍然无法解决我的问题。除此之外,我不知所措。

    编辑:我意识到合并排序类比和树可能是错误的。为了澄清,上面那棵树中的那些值必须是那个EXACT排序。矢量中的定位是该算法的主要部分。

0 个答案:

没有答案