从RDD [(String,Array [String])[Spark / scala]中提取RDD [(Array [String])

时间:2017-06-05 16:01:32

标签: scala apache-spark extract rdd

我有这个prbolem,我有这种RDD [(String,Array [String])之一,我想从中提取RDD [Array [String]],其中包含按键分组的值:

e.g:

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"),...]])
,...]

2 个答案:

答案 0 :(得分:1)

简单的reduceByKey应解决您的问题

x.reduceByKey((prev, next)=> (prev ++ next))

答案 1 :(得分:1)

据我所知,Spark不支持嵌套RDD(请参阅此StackOverflow discussion)。

如果嵌套数组适合您的需要,简单的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)