2014-07-13 52 views
10

Spark是否支持分佈式地圖集合類型?斯卡拉分佈式地圖Spark Spark

因此,如果我有一個HashMap [String,String]是鍵值對,它可以轉換爲分佈式Map集合類型嗎?要訪問元素,我可以使用「過濾器」,但我懷疑這表現如同Map一樣好?

+0

基本上相同的問題http://stackoverflow.com/questions/24513440/creating-a-large-dictionary-in-pyspark/24513951#24513951 – aaronman

回答

8

因爲我發現了一些新的信息,我想我應該把我的意見變成一個答案。 @maasg已經涵蓋了標準lookup函數我想指出你應該小心,因爲如果RDD的分區程序是None,lookup只是使用過濾器。參照火花頂部的(K,V)商店,它看起來像是在進行中,但已經提出了一個可用的拉動請求here。這是一個示例用法。

import org.apache.spark.rdd.IndexedRDD 

// Create an RDD of key-value pairs with Long keys. 
val rdd = sc.parallelize((1 to 1000000).map(x => (x.toLong, 0))) 
// Construct an IndexedRDD from the pairs, hash-partitioning and indexing 
// the entries. 
val indexed = IndexedRDD(rdd).cache() 

// Perform a point update. 
val indexed2 = indexed.put(1234L, 10873).cache() 
// Perform a point lookup. Note that the original IndexedRDD remains 
// unmodified. 
indexed2.get(1234L) // => Some(10873) 
indexed.get(1234L) // => Some(0) 

// Efficiently join derived IndexedRDD with original. 
val indexed3 = indexed.innerJoin(indexed2) { (id, a, b) => b }.filter(_._2 != 0) 
indexed3.collect // => Array((1234L, 10873)) 

// Perform insertions and deletions. 
val indexed4 = indexed2.put(-100L, 111).delete(Array(998L, 999L)).cache() 
indexed2.get(-100L) // => None 
indexed4.get(-100L) // => Some(111) 
indexed2.get(999L) // => Some(0) 
indexed4.get(999L) // => None 

好像拉入請求的一致好評,並可能會被包含在火花的未來版本,所以它可能是安全的使用自己的代碼,拉請求。這裏是JIRA ticket萬一你好奇

+0

不錯:)謝謝。只是好奇,但你是怎麼意識到這一點的? Spark郵件列表? –

+0

@ blue-sky我在郵件列表中,但實際上我想到的方式是瀏覽[spark jira tickets](https://issues.apache.org/jira/browse/SPARK/?selectedTab=com.atlassian。 jira.jira項目 - 插件:問題面板) – aaronman

3

快速回答:部分。

可以通過先迫使映射成(k,v)雙序列,但這樣做你失去一個地圖關鍵字必須是一套約束變換Map[A,B]RDD[(A,B)]。即。你鬆散了Map結構的語義。

從實際的角度來看,您仍然可以使用kvRdd.lookup(element)將元素解析爲其相應的值,但結果將會是一個序列,因爲您沒有保證前面解釋過的單個查找值。

火花殼爲例,把事情說清楚:

val englishNumbers = Map(1 -> "one", 2 ->"two" , 3 -> "three") 
val englishNumbersRdd = sc.parallelize(englishNumbers.toSeq) 

englishNumbersRdd.lookup(1) 
res: Seq[String] = WrappedArray(one) 

val spanishNumbers = Map(1 -> "uno", 2 -> "dos", 3 -> "tres") 
val spanishNumbersRdd = sc.parallelize(spanishNumbers.toList) 

val bilingueNumbersRdd = englishNumbersRdd union spanishNumbersRdd 

bilingueNumbersRdd.lookup(1) 
res: Seq[String] = WrappedArray(one, uno) 
+1

在哪裏查找方法記錄?它似乎沒有在http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.rdd.RDD上可用? –

+0

哦,我不知道隱式轉換:http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.rdd.PairRDDFunctions –

+0

導入'org.apache。 spark.SparkContext._',你很好走。 – maasg