gpt4 book ai didi

scala - Spark 闭包参数绑定(bind)

转载 作者:行者123 更新时间:2023-12-01 05:00:37 26 4
gpt4 key购买 nike

我正在使用 Scala 中的 Apache Spark。

尝试使用来自第二个 RDD 的数据操作一个 RDD 时遇到问题。我试图将第二个 RDD 作为参数传递给正在“映射”到第一个 RDD 的函数,但似乎在该函数上创建的闭包绑定(bind)了该值的未初始​​化版本。

以下是一段更简单的代码,显示了我所看到的问题类型。 (我第一次遇到麻烦的真实例子更大,更难理解)。

我不太了解 Spark 闭包的参数绑定(bind)规则。

我真正在寻找的是一种基本方法或模式,用于如何使用另一个 RDD 的内容(之前在其他地方构建)来操作一个 RDD。

在下面的代码中,调用 Test1.process(sc) 将失败并在 findSquare 中访问空指针(因为闭包中绑定(bind)的第二个参数未初始化)

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
}
}

最佳答案

您遇到的问题与闭包或 RDD 无关,与流行的看法相反,are serializable .

它只是违反了基本的 Spark 规则,该规则指出您不能从另一个操作或转换*触发一个操作或转换*,并且已多次询问此问题的不同变体。

要理解为什么会这样,您必须考虑架构:

  • SparkContext在驱动程序
  • 上进行管理
  • 转换中发生的所有事情都在 worker 身上执行。每个工作人员只能访问自己的部分数据,而不能与其他工作人员通信**。

  • 如果要使用多个 RDD 的内容,则必须使用组合 RDD 的转换之一,例如 join , cartesian , zipunion .

    在这里你很可能(我不确定你为什么传递元组并只使用这个元组的第一个元素)想要使用广播变量:
    val squaresMapBD = sc.broadcast(squaresMap)

    def findSquare(n: Int): Seq[(Int, Int)] = {
    squaresMapBD.value
    .filter{case (k, v) => k == n}
    .map{case (k, v) => (n, k)}
    .take(1)
    }

    primes.flatMap(findSquare)

    或笛卡尔:
    primes
    .cartesian(squaresRDD)
    .filter{case (n, (k, _)) => n == k}.map{case (n, (k, _)) => (n, k)}

    转换 primes到虚拟对 (Int, null)join会更有效率:
    primes.map((_, null)).join(squaresRDD).map(...)

    但根据您的评论,我假设您对存在自然连接条件的场景感兴趣。

    根据上下文,您还可以考虑使用数据库或文件来存储常见数据。

    附带说明 RDD 不可迭代,因此您不能简单地使用 for环形。为了能够做这样的事情,你必须 collect或转换 toLocalIterator第一的。您也可以使用 foreach方法。

    * 准确地说,您无法访问 SparkContext .

    ** Torrent 广播和树聚合涉及执行器之间的通信,因此在技术上是可行的。

    关于scala - Spark 闭包参数绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33190284/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com