当前位置:  开发笔记 > 编程语言 > 正文

如何从Spark RDD创建共生矩阵

如何解决《如何从SparkRDD创建共生矩阵》经验,为你挑选了1个好方法。

我想从一些元组创建一个共生矩阵,见下文:

val rdd = sc.parallelize(Array(
  Array("101","103","105"), Array("102","105"),Array("101","102","103","105"))
val coocMatrix = new ArrayBuffer[(String, Int)]()

// map
rdd.collect().foreach(x => 
  { for(i <- 0 to x.length-1)
  { for(j <- i+1 to x.length-1)
  { coocMatrix += (x(i)+"#"+x(j), 1) }}

// convert to rdd again
val rdd2 = sc.parallelize(coocMatrix)

// reduce
vall matrix = rdd2.collect().groupByKey()

所以我们最终获得了以下数据

(101#103,2),(101#105,2),(102#105,2),(101#102,1),
(103#105,2),(102#103,1),(102#105,1)

这个算法非常慢,因为当有200万个元组时,它是O(n*n)并且是不可行的.有没有算法来计算这种共生矩阵?



1> Christian Hi..:

combinations方法允许您提取给定数组中出现的对列表.之后你可以减少ByKey

    rdd.flatMap{_.combinations(2).map{pairs=>(pairs.mkString("#"),1)}}.
    reduceByKey(_+_)

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有