2

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

所以我想把它转换成rdd,来解决我的问题。

我想要的是让我的 rdd 从:

Key   Value
Jack  [a,b,c]

至 :

Key  value
Jack  a
Jack  b
Jack  c

我看到在那个问题和这个问题中是可能的(PySpark:将一对RDD转换回常规RDD)所以我问如何在java中做到这一点?

问题更新

我的JavaPairRdd的类型是 Type :

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>
4

3 回答 3

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());
于 2018-08-03T08:07:02.970 回答
0

你的类型RDDRDD[(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)]

于 2018-07-14T15:48:34.487 回答
0

如果我理解正确,您需要使用函数 flat map,它使您能够从单个键创建多行,例如在 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"
于 2018-07-11T12:12:06.303 回答