Spark / Scala:将 RDD 传递给函数
Spark / Scala: Passing RDD to Function
我很好奇将 RDD 传递给函数在 Spark 中究竟做了什么。
def my_func(x : RDD[String]) : RDD[String] = {
do_something_here
}
假设我们如上定义了一个函数。当我们调用该函数并传递一个现有的 RDD[String] 对象作为输入参数时,这个 my_function 是否为这个 RDD 创建了一个 "copy" 作为函数参数?换句话说,它是按引用调用还是按值调用?
在 Scala 中,传递时没有任何内容被复制(在 C/C++ 中的按值传递的意义上)。大多数基本类型 Int、String、Double 等都是不可变的,因此通过引用传递它们是非常安全的。 (注意:如果您正在传递一个可变对象并更改它,那么任何引用该对象的人都会看到更改)。
最重要的是,RDD 是惰性的、分布式的、不可变的集合。通过函数传递 RDD 并将 transformation 应用于它们(映射、过滤器等)并不会真正传输任何数据或触发任何计算。
所有链式转换都是 "remembered" 并且当您在 RDD 上执行和 action 时将自动以正确的顺序触发,例如持久化它,或者在驱动程序本地收集它(通过collect()
、take(n)
等)
Spark 实现了“将代码发送到数据”的原则,而不是将数据发送到代码。所以这里会发生完全相反的情况。它是将分发并发送到 RDD 的函数。
RDD 是不可变的,因此您的函数要么创建一个新的 RDD 作为结果(转换),要么创建一些值(操作)。
这里有趣的问题是,如果你定义了一个函数,究竟发送给RDD的是什么(并分布在不同的节点中,有它的传输成本)?这里有一个很好的解释:
http://spark.apache.org/docs/latest/programming-guide.html#passing-functions-to-spark
我很好奇将 RDD 传递给函数在 Spark 中究竟做了什么。
def my_func(x : RDD[String]) : RDD[String] = {
do_something_here
}
假设我们如上定义了一个函数。当我们调用该函数并传递一个现有的 RDD[String] 对象作为输入参数时,这个 my_function 是否为这个 RDD 创建了一个 "copy" 作为函数参数?换句话说,它是按引用调用还是按值调用?
在 Scala 中,传递时没有任何内容被复制(在 C/C++ 中的按值传递的意义上)。大多数基本类型 Int、String、Double 等都是不可变的,因此通过引用传递它们是非常安全的。 (注意:如果您正在传递一个可变对象并更改它,那么任何引用该对象的人都会看到更改)。
最重要的是,RDD 是惰性的、分布式的、不可变的集合。通过函数传递 RDD 并将 transformation 应用于它们(映射、过滤器等)并不会真正传输任何数据或触发任何计算。
所有链式转换都是 "remembered" 并且当您在 RDD 上执行和 action 时将自动以正确的顺序触发,例如持久化它,或者在驱动程序本地收集它(通过collect()
、take(n)
等)
Spark 实现了“将代码发送到数据”的原则,而不是将数据发送到代码。所以这里会发生完全相反的情况。它是将分发并发送到 RDD 的函数。
RDD 是不可变的,因此您的函数要么创建一个新的 RDD 作为结果(转换),要么创建一些值(操作)。
这里有趣的问题是,如果你定义了一个函数,究竟发送给RDD的是什么(并分布在不同的节点中,有它的传输成本)?这里有一个很好的解释:
http://spark.apache.org/docs/latest/programming-guide.html#passing-functions-to-spark