火花,可以组成多种RDD为一体,采用拉链,联合,加盟等..分解星火RDDS
是否有可能有效地分解RDD?也就是说,没有对原始RDD执行多次传递?我所寻找的是一些事情类似:
val rdd: RDD[T] = ...
val grouped: Map[K, RDD[T]] = rdd.specialGroupBy(...)
一个RDDS的优势是他们能够高效地进行迭代计算。在我遇到的一些(机器学习)用例中,我们需要分别对每个组执行迭代算法。
目前的可能性我所知道的是:
的GroupBy:GROUPBY返回RDD [(K,可迭代[T])不给你组本身的RDD利益(的迭代器)。
聚合:比如reduceByKey,foldByKey等只对数据执行一次“迭代”,并且没有实现迭代算法的表达能力。
使用过滤方法创建单独的RDD并对数据进行多次传递(其中传递次数等于密钥数量),但当密钥数量不是非常小时不可行。
一些的用例我正在考虑是,给予了非常大的(表)数据集:
我们希望在每一个不同的列单独执行一些迭代算法。例如,一些自动化的特征提取,一种自然的方法是分解数据集,使得每个列将由单独的RDD表示。
我们希望将数据集分解为不相交的数据集(例如每天的数据集)并对它们中的每一个执行一些机器学习建模。
丹尼尔,我尝试了上面的方法。你提出的问题是对象被写成字符串,即你失去了类型。 我写了下面的代码(本地模式),它克服了这一问题: https://gist.github.com/MishaelRosenthal/108ebbbb7590c7d3104b 但由于某些原因,它是极其缓慢。 我怀疑的是,由于某种原因,它遍历整个数据无数次。 –
不知道,对不起。你的代码在我看来。我自己并没有试图在实践中这样做,所以我不知道会有什么样的表现。也许你可以通过Spark UI(阶段)了解它正在做什么。 –