5

当我将 pyarrow 设置为 true 时,我们使用 spark 会话,但是当我运行 toPandas() 时,它会抛出错误:

"toPandas attempted Arrow optimization because 'spark.sql.execution.arrow.enabled' is set to true. Please set it to false to disable this"

我可以知道为什么会这样吗?

4

2 回答 2

3

默认情况下 PyArrow 被禁用,但在您的情况下它似乎已启用,您必须从当前的 spark 应用程序会话或从 Spark 配置文件永久禁用此配置。

如果您想为所有 Spark 会话禁用此功能,请在 SPARK_HOME/conf/spark-defaults .conf 中将以下行添加到您的 Spark 配置中。 spark.sql.execution.arrow.enabled=false

但如果您在 spark 应用程序中使用 pandas,我建议使用 PyArrow,它将加快 spark 和 pandas 之间的数据转换。

有关 PyArrow 的更多信息,请访问我的博客

于 2019-08-22T05:34:26.973 回答
2

我在 Pyarrow 上遇到了同样的问题。

我的环境:

  • 蟒蛇 3.6
  • 派斯帕克 2.4.4
  • Pyarrow 4.0.1
  • Jupyter 笔记本
  • GCS 上的 Spark 集群

当我尝试像这样启用 Pyarrow 优化时:

spark.conf.set('spark.sql.execution.arrow.enabled', 'true)

我收到以下警告:

createDataFrame attempted Arrow optimization because 'spark.sql.execution.arrow.enabled' is set to true; however failed by the reason below: TypeError: 'JavaPackage' object is not callable

我通过以下方式解决了这个问题:

  1. 打印火花会话的配置:
import  os
from pyspark import SparkConf

spark_config = SparkConf().getAll()
for conf in spark_config:
    print(conf)

这将打印火花配置的键值对。

  1. 在这个键值对中找到了我的 jar 文件的路径:

('spark.yarn.jars', 'path\to\jar\files')

  1. 在找到我的 jar 文件所在的路径后,我打印了 Pyarrow 的 jar 名称,如下所示:
jar_names = os.listdir('path\to\jar\files')
for jar_name in jar_names:
    if 'arrow' in jar_name:
        print(jar_name)

找到以下罐子:

arrow-format-0.10.0.jar
arrow-memory-0.10.0.jar
arrow-vector-0.10.0.jar
  1. 然后在 spark 会话配置中添加箭头 jar 的路径:对于添加多个 jar 文件路径,请使用 : 作为分隔符。

spark.conf.set('spark.driver.extraClassPath', 'path\to\jar\files\arrow-format-0.10.0.jar:path\to\jar\files\arrow-memory-0.10.0.jar:path\to\jar\files\arrow-vector-0.10.0.jar')

  1. 然后重新启动内核和 Pyarrow 优化工作
于 2021-07-02T11:38:25.293 回答