从RDD内的pandas数据帧创建spark数据帧

时间:2019-06-05 01:37:08

标签: pandas apache-spark pyspark

我正在尝试将每个工作节点上的熊猫数据帧(RDD,其中每个元素是一个熊猫数据帧)转换为所有工作节点上的spark数据帧。

示例:

def read_file_and_process_with_pandas(filename):
    data = pd.read(filename)
    """
    some additional operations using pandas functionality
    here the data is a pandas dataframe, and I am using some datetime
    indexing which isn't available for spark dataframes
    """
    return data

filelist = ['file1.csv','file2.csv','file3.csv']
rdd = sc.parallelize(filelist)
rdd = rdd.map(read_file_and_process_with_pandas)

以前的操作有效,所以我有第一个熊猫数据框。完成熊猫处理后,如何将其转换为Spark数据框?

我尝试做rdd = rdd.map(spark.createDataFrame),但是当我做类似rdd.take(5)的操作时,出现以下错误:

PicklingError: Could not serialize object: Py4JError: An error occurred while calling o103.__getnewargs__. Trace:
py4j.Py4JException: Method __getnewargs__([]) does not exist
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:318)
    at py4j.reflection.ReflectionEngine.getMethod(ReflectionEngine.java:326)
    at py4j.Gateway.invoke(Gateway.java:272)
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:132)
    at py4j.commands.CallCommand.execute(CallCommand.java:79)
    at py4j.GatewayConnection.run(GatewayConnection.java:214)
    at java.lang.Thread.run(Thread.java:748)

是否可以将每个工作节点中的熊猫数据帧转换为分布式数据帧?

2 个答案:

答案 0 :(得分:1)

看到这个问题:https://stackoverflow.com/a/51231046/7964197

我不得不处理同样的问题,这似乎很常见(使用熊猫读取许多文件,例如excel / pickle /任何其他非火花格式,并将生成的RDD转换为spark数据帧)

提供的代码在SparkSession上添加了一个新方法,该方法使用pyarrowpd.DataFrame对象转换为箭头记录批,然后直接转换为pyspark.DataFrame对象

spark_df = spark.createFromPandasDataframesRDD(prdd) # prdd is an RDD of pd.DataFrame objects

对于大量数据,这比转换为Row()对象的RDD要快几个数量级。

答案 1 :(得分:0)

Pandas数据帧无法直接转换为rdd。 您可以从熊猫创建Spark DataFrame

spark_df = context.createDataFrame(pandas_df)

参考:Introducing DataFrames in Apache Spark for Large Scale Data Science