将Java-Pair-Rdd转换为Rdd

时间:2018-07-11 10:23:53

标签: java apache-spark rdd key-value java-pair-rdd

我需要将Java-pair-rdd转换为csv:

所以我正在考虑将其转换为rdd,以解决我的问题。

我想要的是将rdd转换 来自:

Key   Value
Jack  [a,b,c]

至:

Key  value
Jack  a
Jack  b
Jack  c

我看到在该issue和本期(PySpark: Convert a pair RDD back to a regular RDD)中都有可能 所以我问如何在Java中做到这一点?

问题更新

我的 JavaPairRdd 的类型为:

JavaPairRDD<Tuple2<String,String>, Iterable<Tuple1<String>>>

这是包含以下内容的行的形式:

((dr5rvey,dr5ruku),[(2,01/09/2013 00:09,01/09/2013 00:27,N,1,-73.9287262,40.75831223,-73.98726654,40.76442719,2,3.96,16,0.5,0.5,4.25,0,,21.25,1,)])

在这里是:(dr5rvey,dr5ruku)[(2,01/09/2013 00:09,01/09/2013 00:27,N,1,-73.9287262,40.75831223,-73.98726654,40.76442719,2,3.96,16,0.5,0.5,4.25,0,,21.25,1,)]

我原来的 JavaRdd 类型:

JavaRDD<String>

3 个答案:

答案 0 :(得分:1)

理解密钥应该保留,您可以使用flatMapValues函数:

  

在不更改键的情况下通过flatMap函数传递键值对RDD中的每个值; ...

JavaPairRDD<Tuple2<String,String>, Iterable<Tuple1<String>>> input = ...;
JavaPairRDD<Tuple2<String, String>, Tuple1<String>> output1 = input.flatMapValues(iter -> iter);
JavaPairRDD<Tuple2<String, String>, String> output2 = output1.mapValues(t1 -> t1._1());

答案 1 :(得分:0)

如果我理解正确,则需要使用平面映射功能,它使您能够从单个键创建多个行,例如在scala中(只是需要针对用例进行更改的想法):

rdd.flatMap(arg0 => {
        var list = List[Row]()
        list = arg0._2.split(",")
        list
    })

这是一个超级简化的示例,但您应该了解要点。

rdd:

key      val
mykey   "a,b,c'

返回的rdd将是:

key      val
mykey   "a"
mykey   "b"
mykey   "c"

答案 2 :(得分:0)

如果我说对了,您的RDD的类型为RDD[(String, Array[String])]。因此,您可以仅在此RDD上应用flatMap。

val rdd: RDD[(String, Array[String])] = ???
val newRDD = rdd.flatMap{case (key, array) => array.map(value => (key, value))}

newRDD的类型为RDD[(String, String)]