如何按和计数RDD [Map [A rray [Int],Int]]

问题描述 投票:0回答:1

我有一个数据作为RDD [Map [A​​rray [String [String],String]]:

(Map(Array[c1, a1] -> Y),
Map(Array[a1] ->Y), 
Map(Array[c1, a1] ->N),
Map[Array[a1] ->N),
Map[Array[a1] ->Y))

我想按键分组,值并按键缩放每个值。我想创建1个RDD [Map [A​​rray [String],Int]]

(Map(Array[c1, a1, Y] -> 0.5),
(Map(Array[c1, a1, N] -> 0.5),
(Map(Array[a1 ,Y ] -> 0.66), 
(Map(Array[a1, N] -> 0.33))

我正在使用Scala和Spark处理大数据。请帮我。谢谢

scala apache-spark grouping rdd
1个回答
0
投票

使用RDD,解决此问题的一种方法是使用reduceByKey收集所有值的列表(在这种情况下为YN)。然后,我们可以根据键计算每个值的比例。

以下解决方案假定每个Map在每一行上只有一对(键,值)(可以扩展以工作更多,但是有点复杂)。

rdd
  .map(m => (m.keys.head, m.values.toList))
  .reduceByKey(_ ::: _)                          // Collect a list with Ys and Ns
  .flatMap{ case(k,v) =>
    val ys = v.filter { _ == "Y" }.size.toFloat  // Number of Ys
    val ns = v.filter { _ == "N" }.size.toFloat  // Number of Ns
    Seq(
      Map((k :+ "Y") -> ys / (ys + ns)),         // Returns two rows for each key
      Map((k :+ "N") -> ns / (ys + ns))
    )
}

结果:

Map(List(c1, a1, Y) -> 0.5)
Map(List(c1, a1, N) -> 0.5)
Map(List(a1, Y) -> 0.6666667)
Map(List(a1, N) -> 0.33333334)
© www.soinside.com 2019 - 2024. All rights reserved.