将 Java-Pair-Rdd 转换为 Rdd

Posted

技术标签:

【中文标题】将 Java-Pair-Rdd 转换为 Rdd【英文标题】:Transform Java-Pair-Rdd to Rdd 【发布时间】:2018-07-11 10:23:53 【问题描述】:

我需要将我的 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,)])

这里的key是:(dr5rvey,dr5ruku)value[(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>

【问题讨论】:

这和你asked yesterday的问题完全一样。如果您有更多信息,请更新该问题而不是创建新问题。 【参考方案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());

【讨论】:

谢谢,但即使是键也不应该有括号 =>**我最后需要一个 csv **【参考方案2】:

如果我理解正确,您需要使用函数 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"

【讨论】:

arg0 是这里的关键? 修正代码 arg0 是一个元组 arg0._1 是键 arg0._2 是 val【参考方案3】:

如果我做对了,你的RDD 的类型是RDD[(String, Array[String])]。所以你可以在这个 RDD 上应用 flatMap。

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

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

【讨论】:

以上是关于将 Java-Pair-Rdd 转换为 Rdd的主要内容,如果未能解决你的问题,请参考以下文章

将Matrix的RDD转换为Vector的RDD

将 RDD 转换为 DataFrame 并再次转换回来的开销是多少?

将 RDD 转换为 Dataframe Spark

为啥 list 应该先转换为 RDD 再转换为 Dataframe?有啥方法可以将列表转换为数据框?

将 Dataframe 转换为 RDD 减少了分区

将地图 RDD 转换为数据框