首页 文章

Scala RDD groupby与所有列一起计算

提问于
浏览
0

我需要获取所有列以及count.In Scala RDD .

Col1 col2  col3 col4
us    A     Q1   10
us    A      Q3   10
us    A      Q2   20
us    B      Q4   10
us    B      Q5   20
uk    A      Q1   10
uk    A      Q3   10
uk    A      Q2   20
uk    B      Q4   10
uk    B      Q5   20

我想要的结果如下:

Col1    col2       col3     col4     count
us         A           Q1       10          3
us         A           Q3      10          3
us         A           Q3      10          3
us         B           Q4      10          2
us         B           Q5      20          2
uk         A           Q1       10          3
uk         A           Q3      10          3
uk         A           Q3      10          3
uk         B           Q4      10          2
uk         B           Q5      20          2

这类似于col1,col2的分组并获得计数 . 现在我需要col13,col4 .

我正在尝试SCALA RDD:

val Top_RDD_1 = RDD.groupBy(f=> ( f._1,f._2 )).mapValues(_.toList)

这产生了

RDD[((String, String), List[(String, String, String, Double, Double, Double)])]

只有(col1,col2),List(col1,col2,col3,col14)的结果如(us,a)List((us,a,Q1,10),(us,a,Q3,10),(us,一,Q2,20)) . ,,,

如何获取列表计数并访问列表值 .

请帮助我激发SCALA RDD代码 .

谢谢Balaji .

1 回答

  • 1

    我可以't see a way to do this in one 1529043 of the RDD - you' ll必须使用 reduceByKey 计算计数,然后 join 计算原始RDD . 为了有效地执行此操作(不会导致重新计算输入),您最好在连接之前输入:http://1529047_ / persist

    val keyed: RDD[((String, String), (String, String, String, Int))] = input
      .keyBy { case (c1, c2, _, _) => (c1, c2) }
      .cache()
    
    val counts: RDD[((String, String), Int)] = keyed.mapValues(_ => 1).reduceByKey(_ + _)
    
    val result = keyed.join(counts).values.map {
      case ((c1, c2, c3, c4), count) => (c1, c2, c3, c4, count)
    }
    

相关问题