只是试图澄清某些东西,一些悬而未决的成果,通过在另一个问题中观察用户尝试在广播变量上调用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-notation创建一个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类型存储在引擎盖下?
答案 0 :(得分:1)
广播变量不是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可能非常大,因此为map函数中的每个值创建一个新副本将非常浪费。
我希望这有帮助!
编辑:我的代码中的一些小错误
EDIT2:
稍微了解一下Broadcast变量的实际内容:
广播变量实际上是Broadcast类型的变量,它可以包含任何类(从Int到您创建的任何对象的任何类型)。它绝不是一个scala集合。所有广播类实际上都提供了两种方法之一,即有效地将数据传输给所有工作人员以重新创建值(内部火花有一个类似于P2P的广播系统,尽管它也允许http传输,尽管我是不确定它是什么时候。)
有关广播变量是什么以及使用方式的更多信息,我建议您查看以下链接:
http://spark.apache.org/docs/latest/programming-guide.html#broadcast-variables
我也强烈建议您阅读本书,因为它对我很有帮助: