我有一个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数据帧。