【问题标题】:How group by and counting RDD[Map[Array[Int],Int]]?如何按 RDD[Map[Array[Int],Int]] 分组和计数?
【发布时间】:2020-08-10 12:44:58
【问题描述】:

我有一些输入数据为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 用于大数据。

【问题讨论】:

标签: scala apache-spark grouping rdd


【解决方案1】:

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

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

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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-17
    • 2019-01-01
    • 2018-06-16
    • 1970-01-01
    • 1970-01-01
    • 2011-05-20
    • 2011-03-04
    • 1970-01-01
    相关资源
    最近更新 更多