加入两个(非)配对的RDD来制作DataFrame

时间:2015-05-26 17:54:00

标签: apache-spark rdd apache-spark-sql pyspark

正如标题所描述的那样,我说有两个RDD

rdd1 = sc.parallelize([1,2,3])
rdd2 = sc.parallelize([1,0,0])

rdd3 = sc.parallelize([("Id", 1),("Id", 2),("Id",3)])
rdd4 = sc.parallelize([("Result", 1),("Result", 0),("Result", 0)])

如何创建以下DataFrame?

Id    Result
1     1
2     0
3     0

如果我可以创建配对的RDD [(1,1),(2,0),(3,0)],那么sqlCtx.createDataFrame会给我我想要的东西,但我不知道如何?

我感谢任何评论或帮助!

2 个答案:

答案 0 :(得分:2)

首先,有一个名为RDD.zipWithIndex的RDD操作。如果你打电话给rdd2.zipWithIndex,你会得到:

scala> rdd2.zipWithIndex collect() foreach println
(1,0)
(0,1)
(0,2)

如果你想让它看起来像你的,那就这样做:

scala> rdd2.zipWithIndex map(t => (t._2 + 1,t._1)) collect() foreach println
(1,1)
(2,0)
(3,0)

如果您确实需要压缩两个RDD,请使用RDD.zip

scala> rdd1.zip(rdd2) collect() foreach println
(1,1)
(2,0)
(3,0)

答案 1 :(得分:1)

如果每个分区具有相同的分区和相同数量的元素,则可以使用zip函数,例如

case class Elem(id: Int, result: Int)
val df = sqlCtx.createDataFrame(rdd1.zip(rdd2).map(x => Elem(x._1, x._2)))