在 Spark 中,可以使用 zip,union,join 等将多个 RDD 组合为一个。
是否可以有效分解 RDD?也就是说,是否不对原始 RDD 执行多次传递?我正在寻找的东西类似于:
val rdd: RDD[T] = ...
val grouped: Map[K, RDD[T]] = rdd.specialGroupBy(...)
RDD 的优势之一是它们使高效地执行迭代计算成为可能。在我遇到的某些(机器学习)用例中,我们需要分别对每个组执行迭代算法。
我知道的当前可能性是:
-
GroupBy:groupBy 返回一个 RDD [(K,Iterable [3])],它没有为组本身(可迭代)提供 RDD 好处。
-
聚合:诸如 reduceByKey,foldByKey 等仅对数据执行一次“迭代”,并且不具有实现迭代算法的表达能力。
-
使用过滤器方法和对数据进行多次遍历(遍历次数等于键数)来创建单独的 RDD,这在键数不是很小的情况下是不可行的。
给定一个非常大的(表格)数据集,我正在考虑的一些用例:
-
我们希望对每个不同的列分别执行一些迭代算法。例如,某些自动特征提取(一种自然的方法)将是分解数据集,以使每个列都由单独的 RDD 表示。
-
我们希望将数据集分解为不相交的数据集(例如每天的数据集),并对每个数据集执行一些机器学习建模。
1 回答
我认为最好的选择是一次将数据写到每个键一个文件(请参见通过键 Spark 写入多个输出-一个 Spark 作业),然后将 per-key 个文件加载到一个 RDD 中。