只是想澄清一些问题,一些悬而未决的问题,这个问题是通过在另一个问题中看着用户试图在广播变量上调用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使用Broadcasts的一些信息,我假设它调用了底层的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)))
在这种情况下,由于哈希映射可能非常大,因此为映射函数中的每个值创建一个新副本将非常浪费。
我希望这有帮助!
编辑:我的代码中的一些小错误
编辑2:
稍微深入了解一下广播变量实际上是什么:
Broadcast变量实际上是Broadcast类型的变量,可以包含任何类(从Int到您创建的任何对象的任何类)。它绝不是scala集合。广播类实际上所做的只是提供将数据有效地传输给所有工作人员以重新创建值的两种方法之一(内部spark具有类似B2P的苦涩的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/