2015-05-11 51 views
1

火花,可以组成多种RDD为一体,采用拉链,联合,加盟等..分解星火RDDS

是否有可能有效地分解RDD?也就是说,没有对原始RDD执行多次传递?我所寻找的是一些事情类似:

val rdd: RDD[T] = ...  
val grouped: Map[K, RDD[T]] = rdd.specialGroupBy(...) 

一个RDDS的优势是他们能够高效地进行迭代计算。在我遇到的一些(机器学习)用例中,我们需要分别对每个组执行迭代算法。

目前的可能性我所知道的是:

  1. 的GroupBy:GROUPBY返回RDD [(K,可迭代[T])不给你组本身的RDD利益(的迭代器)。

  2. 聚合:比如reduceByKey,foldByKey等只对数据执行一次“迭代”,并且没有实现迭代算法的表达能力。

  3. 使用过滤方法创建单独的RDD并对数据进行多次传递(其中传递次数等于密钥数量),但当密钥数量不是非常小时不可行。

一些的用例我正在考虑是,给予了非常大的(表)数据集:

  1. 我们希望在每一个不同的列单独执行一些迭代算法。例如,一些自动化的特征提取,一种自然的方法是分解数据集,使得每个列将由单独的RDD表示。

  2. 我们希望将数据集分解为不相交的数据集(例如每天的数据集)并对它们中的每一个执行一些机器学习建模。

回答

0

我认为最好的办法是在一个单一的传递数据写出每一个关键文件(见Write to multiple outputs by key Spark - one Spark job),那么每个密钥文件加载到每一个RDD。

+0

丹尼尔,我尝试了上面的方法。你提出的问题是对象被写成字符串,即你失去了类型。 我写了下面的代码(本地模式),它克服了这一问题: https://gist.github.com/MishaelRosenthal/108ebbbb7590c7d3104b 但由于某些原因,它是极其缓慢。 我怀疑的是,由于某种原因,它遍历整个数据无数次。 –

+0

不知道,对不起。你的代码在我看来。我自己并没有试图在实践中这样做,所以我不知道会有什么样的表现。也许你可以通过Spark UI(阶段)了解它正在做什么。 –