【问题标题】:Decomposing Spark RDDs分解 Spark RDD
【发布时间】: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 的优势之一是它们能够高效地执行迭代计算。在我遇到的一些(机器学习)用例中,我们需要分别对每个组执行迭代算法。

目前我知道的可能性是:

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

  2. 聚合:如reduceByKey、foldByKey等,只对数据进行一次“迭代”,不具备实现迭代算法的表达能力。

  3. 使用过滤器方法创建单独的RDD,对数据进行多次pass(其中pass的数量等于key的数量),这在key的数量不是非常少的情况下是不可行的。

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

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

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

【问题讨论】:

    标签: apache-spark


    【解决方案1】:

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

    【讨论】:

    • 丹尼尔,我试过上面的方法。您建议的问题是对象被写为字符串,即您丢失了类型。我编写了以下代码(用于本地模式)来克服这个问题:gist.github.com/MishaelRosenthal/108ebbbb7590c7d3104b 但由于某种原因它非常慢。我怀疑的是,由于某种原因,它会多次迭代整个数据。
    • 不知道,抱歉。你的代码在我看来。我自己并没有尝试过在实践中这样做,所以我不知道会有什么表现。也许您可以通过 Spark UI(阶段)了解它在做什么。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 2021-02-24
    • 2015-08-05
    • 1970-01-01
    • 2016-12-16
    • 2017-02-17
    相关资源
    最近更新 更多