我有一个数据作为RDD [Map [Array [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 [Array [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处理大数据。请帮我。谢谢
使用RDD,解决此问题的一种方法是使用reduceByKey
收集所有值的列表(在这种情况下为Y
和N
)。然后,我们可以根据键计算每个值的比例。
以下解决方案假定每个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)