我有这个prbolem,我有这种rdd [(string,array [string](,我想从中提取一个rdd [array [string]]按键分组的值:
例如:
val x :RDD[(String, Array[String]) =
RDD[(a, Array[ "ra", "re", "ri"]),
(a, Array[ "ta", "te", "ti"]),
(b, Array[ "pa", "pe", "pi"])]
我想得到:
val result: RDD[(String, RDD[Array[String]]) =
RDD[(a, RDD[Array[("ra", "re", "ri"),( "ta", "te", "ti")]]),
(b, RDD[Array[("pa", "pe", "pi"),...]])
,...]
简单的reduceByKey
应该解决您的问题
x.reduceByKey((prev, next)=> (prev ++ next))
据我所知,Spark不支持Nested RDD(请参阅此stackoverflow讨论(。
以防嵌套阵列对您需要的东西有益,简单的groupByKey
会做:
val x = sc.parallelize(Seq(
("a", Array( "ra", "re", "ri" )),
("a", Array( "ta", "te", "ti" )),
("b", Array( "pa", "pe", "pi" ))
))
val x2 = x.groupByKey
x2.collect.foreach(println)
(a,CompactBuffer([Ljava.lang.String;@75043e31, [Ljava.lang.String;@18656538))
(b,CompactBuffer([Ljava.lang.String;@2cf30d2e))
x2.collect.foreach{ case (a, b) => println(a + ": " + b.map(_.mkString(" "))) }
a: List(ra re ri, ta te ti)
b: List(pa pe pi)