我正在尝试将每个工作节点上的熊猫数据帧(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)
是否可以将每个工作节点中的熊猫数据帧转换为分布式数据帧?
答案 0 :(得分:1)
看到这个问题:https://stackoverflow.com/a/51231046/7964197
我不得不处理同样的问题,这似乎很常见(使用熊猫读取许多文件,例如excel / pickle /任何其他非火花格式,并将生成的RDD转换为spark数据帧)
提供的代码在SparkSession
上添加了一个新方法,该方法使用pyarrow
将pd.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