【问题标题】:Retrieving values from a map for a filtered set of keys从映射中检索一组过滤的键的值
【发布时间】:2015-12-06 15:46:56
【问题描述】:

我是 Scala 编程的新手,正在寻找一种方法来从映射中检索值列表,以获取另一个映射中的一组过滤键。

前- 过滤器 =[k1,k2,k3] inputMap=[k1->1, k1->2, k2->6, k2->7, k2->9, k3->5, k10->66, k4->45]

outputMap = [k1->(1,2),k2->(6,7,9),k3->(5)]

提前致谢! -南希

【问题讨论】:

  • 如果我正确理解了您的问题,地图中的键是唯一的 - 这意味着您不会在地图中多次使用同一个键 - 您确定这是您想要的吗?
  • 也许您希望您的 inputMap 看起来像这样? Map("k1" -> (1,2), "k2" -> (6, 7, 9), "k3" -> 5, "k10" -> 66, "k4" -> 45)

标签: scala


【解决方案1】:

您的“inputMap”示例看起来更像键值对列表,因为映射不能包含重复键。 所以:

val list = List("k1"->1, "k1"->2, "k2"->6, "k2"->7, "k2"->9, "k3"->5, "k10"->66, "k4"->45)
val f = Set("k1", "k2", "k3")  //filter

第一个过滤器只需要键:

scala>val filtered = list.filter {case (k,v)=>f(k)}
filtered: List[(String, Int)] = List((k1,1), (k1,2), (k2,6), (k2,7), (k2,9), (k3,5))

下一个按键分组:

scala>val grouped = filtered.groupBy(_._1)
grouped: scala.collection.immutable.Map[String,List[(String, Int)]] = Map(k2 -> List((k2,6), (k2,7), (k2,9)), k1 -> List((k1,1), (k1,2)), k3 -> List((k3,5)))

现在转换为所需的格式:

val outputMap = grouped.map {case (k,v)=>k->v.map{case (ki,vi) => vi}}
outputMap: scala.collection.immutable.Map[String,List[Int]] = Map(k2 -> List(6, 7, 9), k1 -> List(1, 2), k3 -> List(5))

【讨论】:

  • 谢谢尼亚夫罗。我正在尝试按照您的建议进行操作。但是,当我尝试过滤时出现错误。 val filters = nodeFollowersList.filter {case (k,v)=>filteredNodesSet(k)} 错误:“无法将构造函数实例化为预期类型;找到 [INFO] : (T1, T2) [INFO] required: org.apache。 spark.rdd.RDD[Array[String]]"
  • nodeFollowersList 是一个元组列表 和filteredNodesSet 是一组节点
  • val lines = sc.textFile("hdfs://moonshot-ha-nameservice" + args(0)) val splitNodes = lines.map(line => line.split("\t" )) val nodeFollowers = splitNodes.map(x => (x(0).toString,x(1).toString)) val nodeFollowersList = List(nodeFollowers) val filteredLines = sc.textFile("hdfs://moonshot-ha -nameservice" + args(1)) val persistedFilteredlines=filteredLines.persist() val splitFilteredNodes=persistedFilteredlines.map(line => line.split(",")) val extractFilteredNodes=splitFilteredNodes.map(line => (line(0 ).substring(1, line(0).length)).toString) val filtersNodesSet =Set(extractFilteredNodes)
  • 在您上次评论的代码中,您有几个问题。您正在错误地构建 List 和 Set 。 Set 和 List 不接受另一个集合作为其 apply 方法的参数。所以 Set(extractFilteredNodes) 表示“创建列表集”。
  • 我建议明确地编写 val-s 的类型。并且不要试图一次编写整个程序。小步走,让一条线工作,然后是另一条线,依此类推。祝你好运!
猜你喜欢
  • 1970-01-01
  • 2017-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 1970-01-01
  • 1970-01-01
  • 2020-01-15
相关资源
最近更新 更多