我试图在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);
}
}
我的nodesRDD
是RDD[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))]
。
答案 0 :(得分:1)
这给了我RDD [(Long,Iterable [(Long,Array(Node))])]
这是不可能的。如果
nodesRDD
即RDD[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
更简单