将 spark 转换为 pandas 数据框有异常:使用基于文件的收集时不支持箭头

Posted

技术标签:

【中文标题】将 spark 转换为 pandas 数据框有异常:使用基于文件的收集时不支持箭头【英文标题】:Convert spark to pandas dataframe has Exception: arrow is not supported when using file-based collect 【发布时间】:2019-08-26 18:00:01 【问题描述】:

我正在尝试在 Azure 数据块上将 spark 数据帧转换为 pandas 数据帧。但我收到以下错误:

例外:使用基于文件的收集时不支持箭头

我已经尝试使用链接的参考代码:https://docs.databricks.com/spark/latest/spark-sql/spark-pandas.html

首先我使用以下行读取 csv 文件:

#read file
df1 = spark.read.csv('/mnt/test/sample.csv', header = True)

接下来我尝试使用以下代码将其转换为 pandas 数据帧:

# Enable Arrow-based columnar data transfers
spark.conf.set("spark.sql.execution.arrow.enabled", "true")
# Convert the Spark DataFrame to a Pandas DataFrame
pandas_df = df1.select("*").toPandas()

但是在这样做的时候我得到了这个错误: 例外:使用基于文件的收集时不支持箭头

这是错误信息的完整扩展:

Exception: arrow is not supported when using file-based collect
---------------------------------------------------------------------------
Exception                                 Traceback (most recent call last)
<command-3700677352136413> in <module>()
      2 spark.conf.set("spark.sql.execution.arrow.enabled", "true")
      3 # Convert the Spark DataFrame to a Pandas DataFrame
----> 4 pandas_df = df1.select("*").toPandas()

/databricks/spark/python/pyspark/sql/dataframe.py in toPandas(self)
   2169                         _check_dataframe_localize_timestamps
   2170                     import pyarrow
-> 2171                     batches = self._collectAsArrow()
   2172                     if len(batches) > 0:
   2173                         table = pyarrow.Table.from_batches(batches)

/databricks/spark/python/pyspark/sql/dataframe.py in _collectAsArrow(self)
   2225         """
   2226         if self._sc._conf.get(self._sc._jvm.PythonSecurityUtils.USE_FILE_BASED_COLLECT()):
-> 2227             raise Exception("arrow is not supported when using file-based collect")
   2228         with SCCallSiteSync(self._sc) as css:
   2229             sock_info = self._jdf.collectAsArrowToPython()

Exception: arrow is not supported when using file-based collect

有人可以帮忙吗?

【问题讨论】:

【参考方案1】:

我终于找到了解决办法。必须更改的是集群的运行时版本。创建了一个新集群并用它运行时版本 5.5 进行了测试,它似乎运行良好。

【讨论】:

【参考方案2】:

为什么不直接从dbfs的挂载路径中使用pandas读取csv文件呢?比如我按照下面的代码和图做的。

pdf = pd.read_csv('/dbfs/mnt/test/test.csv')

我在 Azure Databricks 上成功运行了下面的代码,没有任何错误。

pdf = pd.read_csv('/dbfs/mnt/test/test.csv')
spark.conf.set("spark.sql.execution.arrow.enabled", "true")
df1 = spark.createDataFrame(pdf)
pandas_df = df1.select("*").toPandas()

【讨论】:

以上是关于将 spark 转换为 pandas 数据框有异常:使用基于文件的收集时不支持箭头的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Spark 数据帧转换为 Pandas 并返回 Kedro?

将 Pandas 数据帧转换为 Spark 数据帧的 TypeError

如何将 scala spark.sql.dataFrame 转换为 Pandas 数据框

将 spark 数据帧转换为 pandas 数据帧 - ImportError: Pandas >= 0.19.2 must be installed

将Pandas数据帧转换为Spark数据帧错误

当我们尝试将巨大的 Pandas 数据帧(40-50 百万行)转换为 Spark 2.0 数据帧时如何提高性能