RDD 值为元组时的 ReduceByKey
ReduceByKey when RDD value is a tuple
我是 Apache Spark 的新手,我无法让它工作。
我有一个形式为 (Int,(Int,Int)) 的 RDD,我想在附加第二个元素的同时对值的第一个元素求和。
比如我有如下RDD:
[(5,(1,0)), (5,(1,2)), (5,(1,5)))]
我希望能够得到这样的东西:
(5,3,(0,2,5))
我试过这个:
sampleRdd.reduceByKey{case(a,(b,c)) => (a + b)}
但是我得到这个错误:
type mismatch;
[error] found : Int
[error] required: String
[error] .reduceByKey{case(a,(b,c)) => (a + b)}
[error] ^
我怎样才能做到这一点?
请试试这个
def seqOp = (accumulator: (Int, List[String]), element: (Int, Int)) =>
(accumulator._1 + element._1, accumulator._2 :+ element._2.toString)
def combOp = (accumulator1: (Int, List[String]), accumulator2: (Int, List[String])) => {
(accumulator1._1 + accumulator2._1, accumulator1._2 ::: accumulator2._2)
}
val zeroVal = ((0, List.empty[String]))
rdd.aggregateByKey(zeroVal)(seqOp, combOp).collect
我是 Apache Spark 的新手,我无法让它工作。
我有一个形式为 (Int,(Int,Int)) 的 RDD,我想在附加第二个元素的同时对值的第一个元素求和。
比如我有如下RDD:
[(5,(1,0)), (5,(1,2)), (5,(1,5)))]
我希望能够得到这样的东西:
(5,3,(0,2,5))
我试过这个:
sampleRdd.reduceByKey{case(a,(b,c)) => (a + b)}
但是我得到这个错误:
type mismatch;
[error] found : Int
[error] required: String
[error] .reduceByKey{case(a,(b,c)) => (a + b)}
[error] ^
我怎样才能做到这一点?
请试试这个
def seqOp = (accumulator: (Int, List[String]), element: (Int, Int)) =>
(accumulator._1 + element._1, accumulator._2 :+ element._2.toString)
def combOp = (accumulator1: (Int, List[String]), accumulator2: (Int, List[String])) => {
(accumulator1._1 + accumulator2._1, accumulator1._2 ::: accumulator2._2)
}
val zeroVal = ((0, List.empty[String]))
rdd.aggregateByKey(zeroVal)(seqOp, combOp).collect