【发布时间】:2015-10-17 18:43:31
【问题描述】:
我正在使用 Scala 中的 Apache Spark。
我在尝试使用来自第二个 RDD 的数据操作一个 RDD 时遇到问题。我试图将第二个 RDD 作为参数传递给正在“映射”到第一个 RDD 的函数,但似乎在该函数上创建的闭包绑定了该值的未初始化版本。
以下是一段更简单的代码,显示了我所看到的问题类型。 (我第一次遇到麻烦的真实例子更大,更难理解)。
我不太了解 Spark 闭包的参数绑定规则。
我真正在寻找的是一种基本方法或模式,用于如何使用另一个 RDD 的内容(之前在其他地方构建)来操作一个 RDD。
在以下代码中,调用 Test1.process(sc) 将失败并在 findSquare 中访问空指针(因为闭包中绑定的第二个参数未初始化)
object Test1 {
def process(sc: SparkContext) {
val squaresMap = (1 to 10).map(n => (n, n * n))
val squaresRDD = sc.parallelize(squaresMap)
val primes = sc.parallelize(List(2, 3, 5, 7))
for (p <- primes) {
println("%d: %d".format(p, findSquare(p, squaresRDD)))
}
}
def findSquare(n: Int, squaresRDD: RDD[(Int, Int)]): Int = {
squaresRDD.filter(kv => kv._1 == n).first._1
}
}
【问题讨论】:
标签: scala apache-spark