在Spark df,镶木地板对象和pandas df之间转换

时间:2019-10-20 21:57:20

标签: apache-spark parquet pyarrow

我将镶木地板文件转换为大熊猫没有问题,但是在将镶木地板转换为spark df和将spark df转换为熊猫时遇到了问题。

创建Spark会话后,我运行了这些代码

  

spark_df = spark.read.parquet('summarydata.parquet')

     

spark_df.select('*')。toPandas()

返回错误 enter image description here

或者,使用镶木地板对象(pd.read_table('summary data.parquet'),如何将其转换为spark df?

我同时需要spark df和pandas df的原因是,对于一些较小的DataFrame,我想轻松地使用各种pandas EDA函数,但是对于一些较大的我需要使用spark sql。先将镶木地板变成大熊猫然后再引发df似乎有点绕路。

1 个答案:

答案 0 :(得分:1)

要将Pandas数据框转换为Spark数据框,反之亦然,您必须使用pyarrow,这是一种内存列数据格式,在Spark中使用,可以在JVM和Python进程之间高效地传输数据。

当使用对toPandas()的调用将Spark DataFrame转换为Pandas DataFrame以及使用createDataFrame(pandas_df)从Pandas DataFrame创建Spark DataFrame时,可以将箭头作为一种优化。要在执行这些调用时使用Arrow,用户需要首先将Spark配置spark.sql.execution.arrow.enabled设置为true。默认情况下,此功能是禁用的。

此外,如果在Spark内部实际计算之前发生错误,则spark.sql.execution.arrow.enabled启用的优化可能会自动回退到非箭头优化实现。可以通过spark.sql.execution.arrow.fallback.enabled进行控制。

有关更多详细信息,请参见此链接PySpark Usage Guide for Pandas with Apache Arrow

import numpy as np
import pandas as pd

# Enable Arrow-based columnar data transfers
spark.conf.set("spark.sql.execution.arrow.enabled", "true")

# Generate a Pandas DataFrame
pdf = pd.DataFrame(np.random.rand(100, 3))

# Create a Spark DataFrame from a Pandas DataFrame using Arrow
df = spark.createDataFrame(pdf)

# Convert the Spark DataFrame back to a Pandas DataFrame using Arrow
result_pdf = df.select("*").toPandas()