我有一个相当小的查找文件,我需要广播以提高效率。
如果键值对是唯一的,那么您可以使用以下代码将文件作为散列映射分布在工作节点上。
val index_file = sc.textFile("reference.txt").map { line => ( (line.split("\t"))(1), (line.split("\t"))(0)) }
val index_map = index_file.collectAsMap()
sc.broadcast(index_map)
不幸的是,该文件有一些给定密钥的条目。有没有办法分发这个multimap变量?阅读文档,看起来像collectAsMap不支持多图。
val mmap = new collection.mutable.HashMap[String, collection.mutable.Set[Int]]() with collection.mutable.MultiMap[String, Int]
val index_map = sc.textFile("reference.txt").map {
case line =>
val key = (line.split("\t"))(1)
val value = (line.split("\t"))(0).toInt
mmap.addBinding(key, value)
}
现在我如何广播index_map?
答案 0 :(得分:0)
您可以使用sc.broadcast(mmap)
广播地图,但这只是将地图的副本分发到您的工作节点,以便您的工作节点上的数据可访问。
从您的代码中,您真正想要的是从工作人员更新地图,但您不能这样做。工人没有相同的地图实例,因此他们每个都会更新自己的地图。您可以做的是将文本文件拆分为键值对(并行),然后收集它们并将它们放入地图中:
val mmap = new collection.mutable.HashMap[String, collection.mutable.Set[Int]]() with collection.mutable.MultiMap[String, Int]
val index_map = sc.textFile("reference.txt")
.collect
.map (line => {
val key = (line.split("\t"))(1)
val value = (line.split("\t"))(0).toInt
mmap.addBinding(key, value)
})
使用Spark进行数据适合地图的任务对我来说似乎有些过分,但是;)