【问题标题】:Spark use reduceByKey on nested structureSpark 在嵌套结构上使用 reduceByKey
【发布时间】:2015-05-09 23:29:43
【问题描述】:

目前我有这样的结构: Array[(Int, Array[(String, Int)])],我想在元组数组中的Array[(String, Int)] 上使用reduceByKey。我试过像

这样的代码
//data is in Array[(Int, Array[(String, Int)])] structure
val result = data.map(l => (l._1, l._2.reduceByKey(_ + _)))

错误是告诉Array[(String,Int)]没有名为reduceByKey的方法,我知道这个方法只能在RDD上使用。所以我的问题是,有没有办法使用“reduceByKey”功能,在嵌套结构中不需要完全使用这种方法?

谢谢各位。

【问题讨论】:

    标签: scala nested apache-spark rdd


    【解决方案1】:

    您只需在此处使用Arrayreduce 方法,因为您现在使用的是Array 而不是RDD(假设您的真正意思是外包装是RDD

    val data = sc.parallelize(List((1,List(("foo", 1), ("foo", 1)))))
    data.map(l=>(l._1, l._2.foldLeft(List[(String, Int)]())((accum, curr)=>{
      val accumAsMap = accum.toMap
      accumAsMap.get(curr._1) match {
        case Some(value : Int) => (accumAsMap + (curr._1 -> (value + curr._2))).toList
        case None => curr :: accum 
      }
    }))).collect
    

    最终,您似乎不了解RDD 是什么,因此您可能想阅读其中的一些文档。

    【讨论】:

    • 对不起,您的解决方案不起作用。错误说“需要字符串,但找到(字符串,整数)”。我只是在互联网上找不到 API。我想要像reduceByKey 这样的东西。
    • 您正在使用 Scala API,这就是为什么您找不到它...不是 RDD。而且,很抱歉你想要一个 reduceLeft (它允许改变类型)。更新了我的答案
    • 还是不行。我正在尝试按键减少,这意味着对于数组中的每个(String, Int) 元组,通过将这些整数加在一起来组合具有相同字符串的所有元组。我认为reducereduceLeft 没有办法做到这一点。我尝试了自定义reduce函数,但输入和输出类型不适合参数。
    • 我没有注意这些类型。我更新了我的答案以便它工作(我这次验证了)
    猜你喜欢
    • 2017-10-07
    • 1970-01-01
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多