Spark:广播多图

时间:2016-01-27 06:25:23

标签: apache-spark

我有一个相当小的查找文件,我需要广播以提高效率。

如果键值对是唯一的,那么您可以使用以下代码将文件作为散列映射分布在工作节点上。

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?

1 个答案:

答案 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进行数据适合地图的任务对我来说似乎有些过分,但是;)