2016-01-18 72 views
0

只是试图澄清一些事情,一些低悬的成果,通过观看用户在另一个试图调用广播变量的RDD操作的问题中产生的问题?这是错的,对吧?Apache Spark广播变量是类型广播?不是RDD?

问题是:Spark广播变量不是RDD,是否正确?这是斯卡拉的一个集合,我看到了吗?

望着斯卡拉文档: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广播类型存储在引擎之下?

+1

是的,这不是RDD,它只是创建并摧毁你的每个执行人的所有数据。是的,python api只是在下面调用scala代码。 – ipoteka

回答

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的可能是非常大的,将是极其浪费在地图功能的每个值创建一个新的副本。

我希望这有助于!

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

EDIT2:

要转到稍微成一个什么样的广播变量实际上是螺母和螺栓:

广播变量实际上的变量可以包含任何类的类型广播(从Int到任何您创建的对象的任何内容)。它绝不是一个scala的集合。所有的广播级实际上都提供了两种方式之一,有效地将数据传输给所有工作人员以重新创建值(内部点燃具有类似P2P的广播系统,虽然它也允许http传输,尽管我不确定当它或者)。

有关什么是广播变量,以及如何使用它,我建议你检查出这个链接的详细信息:

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

我会还强烈建议寻找到这本书,因为它是非常有帮助我说:

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

+0

我真的很感激这个答案,如果你能明确定义广播变量的实际内容,那么它几乎可以作为一个我可以点击ACCEPT按钮的资格?我认为这是一个斯卡拉的集合,这是正确的词?或者它只是我定义它的内容,就像int可能那样简单?有没有可以提供给具体定义的链接?我找不到它。但也许我不知道在哪里看:)其他很好的解释的实际使用 – JimLohse

+0

我想答案是,该类型是广播? – JimLohse

+1

当然,让我加我的答案。 –