Spark是否支持分佈式地圖集合類型?斯卡拉分佈式地圖Spark Spark
因此,如果我有一個HashMap [String,String]是鍵值對,它可以轉換爲分佈式Map集合類型嗎?要訪問元素,我可以使用「過濾器」,但我懷疑這表現如同Map一樣好?
Spark是否支持分佈式地圖集合類型?斯卡拉分佈式地圖Spark Spark
因此,如果我有一個HashMap [String,String]是鍵值對,它可以轉換爲分佈式Map集合類型嗎?要訪問元素,我可以使用「過濾器」,但我懷疑這表現如同Map一樣好?
因爲我發現了一些新的信息,我想我應該把我的意見變成一個答案。 @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萬一你好奇
不錯:)謝謝。只是好奇,但你是怎麼意識到這一點的? Spark郵件列表? –
@ blue-sky我在郵件列表中,但實際上我想到的方式是瀏覽[spark jira tickets](https://issues.apache.org/jira/browse/SPARK/?selectedTab=com.atlassian。 jira.jira項目 - 插件:問題面板) – aaronman
快速回答:部分。
可以通過先迫使映射成(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)
在哪裏查找方法記錄?它似乎沒有在http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.rdd.RDD上可用? –
哦,我不知道隱式轉換:http://spark.apache.org/docs/latest/api/scala/index.html#org.apache.spark.rdd.PairRDDFunctions –
導入'org.apache。 spark.SparkContext._',你很好走。 – maasg
基本上相同的問題http://stackoverflow.com/questions/24513440/creating-a-large-dictionary-in-pyspark/24513951#24513951 – aaronman