首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >group by and counting [Map[Array[Int],Int]]?

group by and counting [Map[Array[Int],Int]]?
EN

Stack Overflow用户
提问于 2020-04-27 10:27:11
回答 1查看 64关注 0票数 1

我有一些RDD[Map[Array[String],String]]格式的输入数据

代码语言:javascript
复制
(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]],如下所示:

代码语言:javascript
复制
(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。

EN

回答 1

Stack Overflow用户

发布于 2020-04-27 10:59:33

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

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

代码语言:javascript
复制
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)}
}

结果:

代码语言:javascript
复制
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)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61450802

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档