如何将Pandas DataFrame对象的PySpark RDD转换为单个Spark DataFrame



我有一个PySpark RDD,其中每一行都是Pandas对象,我需要获得一个数据帧结果。

这与已经回答的以下问题类似,但公认的解决方案使用的PySpark功能仅在旧版本(3.0.0(中可用

旧版本的GitHub解决方案

StackOverflow问题1

StackOverflow问题2

用调用数据帧转换

RDD.toDF() 

直接导致错误。数据帧的真值不明确。

这是通过收集RDD的所有行来操作的

rdd.collect()

但这是非常慢的,并且将所有数据回调给一个驱动程序。

用调用RDD内每个数据帧上的spark数据帧转换

.toDF()

由于双精度和字符串之间的marge类型错误,它也不起作用,所以我必须使用传递Pandas数据帧

.astype(str)

这是非常缓慢的。

有更好的方法吗?

这里有一种创建spark数据帧的方法,但我猜这个方法也会很慢。

使用reduce()pd.concat()返回pandas数据帧,然后对结果使用createDataFrame()创建spark数据帧。

spark.sparkContext.parallelize([pdf1, pdf2, pdf3, pdf4]).
reduce(lambda x, y: pd.concat([x, y]))

前面提到的将返回一个单独的panda数据帧,并附加所有单独的数据帧。在其上使用createDataFrame()来获得spark数据帧。

spark.createDataFrame(
spark.sparkContext.parallelize([pdf1, pdf2, pdf3, pdf4]).
reduce(lambda x, y: pd.concat([x, y]))
)

前面提到的将使用RDD.reduce()的结果创建一个spark数据帧,该结果将返回pandas数据帧。

最新更新