如何使用Spark的“map”复制我的for循环?

时间:2018-01-05 19:47:22

标签: scala apache-spark rdd

我试图在Spark和Scala中实现这个逻辑。初始逻辑在Java中指定(我希望它不是一个大问题:))。

Map<Object,List<Integer>> myMap = new HashMap<Object,List<Integer>>();

for (int i=0; i<len; i++) {
   String module = nodes.getAttribute(i);
   Integer k_i = nodes.getK(i);
   if (!myMap.containsKey(module)) {
      List<Integer> list = new ArrayList<Integer>();
      list.add(k_i);
      myMap.put(module,list);
   }
   else {
      List<Integer> list = myMap.get(module);
      list.add(k_i);
      myMap.put(module,list);
   }
}

我的nodesRDDRDD[Node],但我不知道在每次迭代中检查其内容时如何逐步创建myMap。 任何提示都将非常有价值。

val myMap = nodes.map( node => {
  val module = node.getAttribute()
  (module, node)
})
.groupBy(_._1)

这给了我RDD[(Long, Iterable[(Long,Array(Node))])]。但我需要RDD[(Long, Array(Node))]

1 个答案:

答案 0 :(得分:1)

  

这给了我RDD [(Long,Iterable [(Long,Array(Node))])]

这是不可能的。如果

  

nodesRDDRDD[Node]

getAttribute的类型为T,然后是:

nodes.map( node => {
  val module = node.getAttribute()
  (module, node)
})

应为RDD[(T, Node)].groupBy(_._1)应为RDD[(T, Iterable[(T, Node)])]

  

但我需要RDD [(Long,Array(Node))]。

然后

myMap.mapValues(_.map(_._2).toArray)

当然:

nodes.groupBy(_.getAttribute()).mapValues(_.toArray)

nodes.map( node => {
  (node.getAttribute(), node)
}).groupByKey

更简单