我有一些RDD[Map[Array[String],String]]格式的输入数据
(Map(Array[c1, a1] -> Y),
Map(Array[a1] ->Y),
Map(Array[c1, a1] ->N),
Map[Array[a1] ->N),
Map[Array[a1] ->Y))我想要按键分组,值,并按键缩放每个值。作为输出,我想创建一个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来处理bigdata。
发布于 2020-04-27 10:59:33
使用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 uniqueCount = v.groupBy(identity) // Unique values and their counts
.mapValues(_.size)
val totalCount = v.size.toFloat // Total count
// Create return list with Maps
uniqueCount.map{case (uniqueVal, uniqueCount) => Map((k :+ uniqueVal) -> uniqueCount / totalCount)}
}结果:
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)https://stackoverflow.com/questions/61450802
复制相似问题