我需要将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>
答案 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)]