Spark - 计算事件的转换总数

时间:2017-10-29 16:20:36

标签: scala apache-spark

拥有以下RDD:

RDD =(AAAAABAAAAABAAAAABAAAAAB,BBAAAAAAAAAABBAAAAAAAAAA)

我必须计算事件之间的转换总数,因此对于此示例,结果应为:

  ("A","B") -> 5 , ("B","A") -> 5 

目前,我有以下解决方案,但我不知道是否可以实现更高效的解决方案。

val rddSplited =  rdd.map((x) => x.split(":")(1)
.replaceAll("(.)\\1+", "$1"))
val finalrdd =  rddSplited.flatMap(x => x.sliding(2))
.map(x => ((x.charAt(0).toString,x.charAt(1).toString),1l))
val finalmap = finalrdd.reduceByKey(_+_).collectAsMap()

感谢。

1 个答案:

答案 0 :(得分:0)

某些过滤和分组可以包含在" flatMap"

rddSplited.flatMap(row => row.sliding(2).
    filter(pair => pair(0) != pair(1)).toSeq.groupBy(identity).mapValues(_.length)
)

结果:

(BA,3)
(AB,4)
(BA,2)
(AB,1)