将 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的主要内容,如果未能解决你的问题,请参考以下文章
将 RDD 转换为 DataFrame 并再次转换回来的开销是多少?