繁体   English   中英

Scala Spark中的分布式映射

[英]Distributed Map in Scala Spark

Spark支持分布式Map集合类型吗?

因此,如果我有一个HashMap [String,String],它们是键值对,可以将它转换为分布式Map集合类型吗? 要访问该元素,我可以使用“过滤器”,但我怀疑它的表现和Map一样好吗?

由于我发现了一些新信息,我认为我会将我的评论转化为答案。 @maasg已经涵盖了标准lookup功能我想指出你应该小心,因为如果RDD的分区器是None,查找只是使用过滤器。 关于spark之上的(K,V)存储,它看起来正在进行中,但是这里已经有了一个可用的pull请求。 这是一个示例用法。

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

似乎pull请求很受欢迎,可能会包含在未来版本的spark中,因此在您自己的代码中使用该pull请求可能是安全的。 这是JIRA票 ,以防你好奇

快速回答:部分。

您可以通过首先将地图强制转换为(k,v)对的序列,将Map[A,B]转换为RDD[(A,B)] ,但这样做可以解除地图的关键点必须是约束的约束。一套。 即。 你松开了Map结构的语义。

从实际角度来看,您仍然可以使用kvRdd.lookup(element)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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM