Spark是否支持分布式地图集合类型?
因此,如果我有一个HashMap [String,String]是键值对,那么这可以转换为分布式Map集合类型吗?要访问该元素,我可以使用“过滤器”,但我怀疑它的表现和Map一样好吗?
答案 0 :(得分:9)
由于我发现了一些新信息,我认为我会将我的评论转化为答案。 @maasg已经涵盖了标准的lookup
函数我想指出你应该小心,因为如果RDD的分区是None,那么查找只是使用过滤器。参考spark之上的(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
似乎拉取请求很受欢迎,可能会包含在未来版本的spark中,因此在您自己的代码中使用该拉取请求可能是安全的。如果您感到好奇,这是JIRA ticket
答案 1 :(得分:3)
快速回答:部分。
您可以先将Map[A,B]
转换为RDD[(A,B)]
,然后将地图强制转换为(k,v)
对的序列,但这样做可以解除地图的关键字必须是组。即。你失去了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)