【问题标题】:Spark / Scala: Passing RDD to FunctionSpark / Scala:将 RDD 传递给函数
【发布时间】:2015-09-11 10:59:33
【问题描述】:

我很好奇将 RDD 传递给 Spark 中的函数究竟做了什么。

def my_func(x : RDD[String]) : RDD[String] = {
  do_something_here
}

假设我们如上所述定义了一个函数。当我们调用该函数并传递一个现有的 RDD[String] 对象作为输入参数时,这个 my_function 是否会为这个 RDD 做一个“副本”作为函数参数?换句话说,它是按引用调用还是按值调用?

【问题讨论】:

    标签: scala apache-spark rdd


    【解决方案1】:

    Spark 实现了“将代码发送到数据”的原理,而不是将数据发送到代码。所以在这里它会发生完全相反的情况。它将被分发并发送到 RDD 的函数。

    RDD 是不可变的,因此您的函数将创建一个新的 RDD 作为结果(转换)或创建一些值(操作)。

    这里有趣的问题是,如果你定义一个函数,究竟什么会被发送到 RDD(并分布在不同的节点之间,以及它的传输成本)?这里有一个很好的解释:

    http://spark.apache.org/docs/latest/programming-guide.html#passing-functions-to-spark

    【讨论】:

      【解决方案2】:

      在 Scala 中,在传递时没有任何东西被复制(在 C/C++ 中按值传递的意义上)。大多数基本类型 Int、String、Double 等都是不可变的,因此通过引用传递它们是非常安全的。 (注意:如果您传递一个可变对象并对其进行了更改,那么任何对该对象的引用都会看到更改)。

      最重要的是,RDD 是惰性的、分布式的、不可变的集合。通过函数传递 RDD 并将 transformation 应用于它们(映射、过滤器等)并不会真正传输任何数据或触发任何计算。

      所有链式转换都被“记住”,并且当您在 RDD 上执行 action 时,将自动以正确的顺序触发,例如持久化它,或在驱动程序本地收集它(通过 collect()、@987654324 @等)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-01
        • 1970-01-01
        • 2019-06-19
        • 2015-07-18
        • 1970-01-01
        • 1970-01-01
        • 2018-09-15
        相关资源
        最近更新 更多