【发布时间】:2015-05-12 05:45:54
【问题描述】:
在Spark中,可以将多个RDD组合成一个,使用zip、union、join等...
是否可以有效地分解RDD?即,不对原始 RDD 执行多次传递?我正在寻找的是类似于:
val rdd: RDD[T] = ...
val grouped: Map[K, RDD[T]] = rdd.specialGroupBy(...)
RDD 的优势之一是它们能够高效地执行迭代计算。在我遇到的一些(机器学习)用例中,我们需要分别对每个组执行迭代算法。
目前我知道的可能性是:
GroupBy:groupBy 返回一个 RDD[(K, Iterable[T])],它不会为您提供组本身(可迭代)的 RDD 好处。
聚合:如reduceByKey、foldByKey等,只对数据进行一次“迭代”,不具备实现迭代算法的表达能力。
使用过滤器方法创建单独的RDD,对数据进行多次pass(其中pass的数量等于key的数量),这在key的数量不是非常少的情况下是不可行的。
我正在考虑的一些用例是,给定一个非常大的(表格)数据集:
我们希望在每个不同的列上分别执行一些迭代算法。例如,一些自动特征提取,一种自然的方法是分解数据集,以便每一列将由一个单独的 RDD 表示。
我们希望将数据集分解为不相交的数据集(例如每天一个数据集),并对每个数据集执行一些机器学习建模。
【问题讨论】:
标签: apache-spark