2016-01-18 69 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

當然,讓我加我的答案。 –