分解Spark RDD

时间:2015-05-11 12:48:24

标签: apache-spark

在Spark中,可以使用zip,union,join等将多个RDD组合成一个......

是否有可能有效地分解RDD?即,不对原始RDD执行多次传递?我正在寻找的东西类似于:

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

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

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

  1. GroupBy:groupBy返回RDD [(K,Iterable [T])],它不会为组本身(可迭代)提供RDD好处。

  2. 聚合:例如reduceByKey,foldByKey等只执行一次"迭代"在数据上,并没有实现迭代算法的表达能力。

  3. 使用过滤方法创建单独的RDD并对数据进行多次传递(其中传递次数等于键的数量),这在键的数量不是很小时是不可行的。

  4. 我正在考虑的一些用例,给定一个非常大的(表格)数据集:

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

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

1 个答案:

答案 0 :(得分:0)

我认为最好的选择是将每个密钥一次性写入一个文件中的数据(参见Write to multiple outputs by key Spark - one Spark job),然后将每个密钥文件加载到一个RDD中。