gpt4 book ai didi

java - Apache Spark Broadcast 变量是 Broadcast 类型?不是RDD?

转载 作者:行者123 更新时间:2023-12-01 10:34:27 28 4
gpt4 key购买 nike

只是想澄清一些事情,一些容易实现的目标,一个通过在另一个问题中观察用户试图对广播变量调用 RDD 操作而产生的问题?这是错误的,对吧?

问题是:Spark 广播变量不是 RDD,对吗?这是 Scala 中的集合,我没看错吗?

查看 Scala 文档:http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.broadcast.Broadcast

那么它具有在创建时分配的任何子类型,即传递给它的任何子类型?就像如果这是一个 Java ArrayList 它会是一个整数的 ArrayList 吗?所以

sc.broadcast([0,1,2]) 会用 scala 表示法创建一个 Broadcast[Array[Int]] 吗?

scala> val broadcastVar = sc.broadcast(Array(1, 2, 3))
broadcastVar: org.apache.spark.broadcast.Broadcast[Array[Int]] = Broadcast(0)

scala> broadcastVar.value
res0: Array[Int] = Array(1, 2, 3)

(我确实搜索了相当多的地方来寻找一个清晰直接的答案,但它一定是一个太基础的问题,但理解起来非常重要,谢谢。)

如果有一些关于 Python 如何使用广播的信息就好了,但没有必要,我假设它调用底层 Scala 类,并且在底层存储为 Scala Broadcast 类型?

最佳答案

广播变量不是 RDD,但它也不一定是 scala 集合。本质上,您应该将广播变量视为每台机器本地的本地变量。每个工作人员都会拥有您广播的任何内容的副本,因此您无需担心将其分配给特定的 RDD 值。

使用 RDD 的最佳时机是当您有一个相当大的对象,并且需要 RDD 中的大多数值时。

一个例子是

val zipCodeHash:HashMap[(Int, List[Resident])] //potentially a very large hashmap
val BVZipHash = sc.broadcast(zipCodeHash)

val zipcodes:Rdd[String] = sc.textFile("../zipcodes.txt")

val allUsers = zipcodes.flatMap(a => BVZipHash.value((a.parseInt)))

在这种情况下,由于 HashMap 可能非常大,因此为映射函数中的每个值创建一个新副本将是极其浪费的。

希望这会有所帮助!

编辑:我的代码中存在一些小错误

编辑2:

进一步了解广播变量的具体细节:

广播变量实际上是广播类型的变量,可以包含任何类(从 Int 到您创建的任何对象的任何类)。它绝不是一个 scala 集合。广播类实际上所做的只是提供两种有效地将数据传输给所有工作人员以重新创建值的方法之一(spark 内部有一个类似 bittorent 的 P2P 广播系统,尽管它也允许 http 传输,但我不确定当它发生时)。

有关广播变量是什么以及如何使用它的更多信息,我建议您查看此链接:

http://spark.apache.org/docs/latest/programming-guide.html#broadcast-variables

我还强烈建议您阅读这本书,因为它对我非常有帮助:

http://shop.oreilly.com/product/0636920028512.do

关于java - Apache Spark Broadcast 变量是 Broadcast 类型?不是RDD?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34864751/

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