Extract RDD[(Array[String]) from RDD[(String, Array[String])



我有这个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)

最新更新