【问题标题】:Unable to perform aggregation on 2 values using groupByKey in spark using scala无法使用 scala 在 spark 中使用 groupByKey 对 2 个值执行聚合
【发布时间】:2019-02-13 16:19:46
【问题描述】:

这个问题是关于使用 scala 的 spark 中的 groupByKey()。

考虑以下数据

Name,marks,value
Chris,30,1
Chris,35,1
Robert,12,1
Robert,20,1

在rdd下面创建

val dataRDD = sc.parallelize(List(("Chris",30,1),("Chris",35,1),("Robert",12,1),("Robert",20,1)))

我正在尝试创建这样的键值对

val kvRDD = dataRDD.map(rec=> (rec._1, (rec._2,rec._3)))

现在我想要两个值的总和。

val sumRDD = kvRDD.groupByKey().map(rec => (rec._1,(rec._2._1.sum, rec._2._2.sum)))

但是,我面临以下错误。

<console>:28: error: value _2 is not a member of Iterable[(Int, Int)]

我们不能使用groupByKey 达到要求吗?

【问题讨论】:

    标签: scala apache-spark rdd


    【解决方案1】:

    我建议使用更高效的reduceByKey,而不是groupByKey

    val dataRDD = sc.parallelize(Seq(
      ("Chris",30,1), ("Chris",35,1), ("Robert",12,1), ("Robert",20,1)
    ))
    
    val kvRDD = dataRDD.map(rec => (rec._1, (rec._2, rec._3)))
    
    val sumRDD = kvRDD.reduceByKey{ (acc, t) =>
      (acc._1 + t._1, acc._2 + t._2)
    }
    
    sumRDD.collect
    // res1: Array[(String, (Int, Int))] = Array((Robert,(32,2)), (Chris,(65,2)))
    

    【讨论】:

      【解决方案2】:

      kvRDD 的值是arraytuple 所以你可以直接对array 的值求和,你可以像下面这样做

      val sumRDD=kvRDD.groupByKey.map(rec=>(rec._1,(rec._2.map(_._1).sum,rec._2.map(_._2).sum)))
      
      //Output
      scala> sumRDD.collect
      res11: Array[(String, (Int, Int))] = Array((Robert,(32,2)), (Chris,(65,2)))
      

      【讨论】:

        【解决方案3】:

        建议在这种情况下使用reduceByKey,但如果你想使用groupByKey,你可以尝试下面的方法。我正在用 python 方式做,你可以用 scala 尝试同样的方法。

         def summly(ilist):
                sum1=0
                sum2=0
                for i in ilist:
                   sum1=sum1+i[0]
                   sum2=sum2+i[1]
                return (sum1,sum2)
        
        sumRDD = kvRDD.groupByKey().map(lambda x : (x[0],summly(list(x[1])))
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2017-04-25
          • 2017-04-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多