我已经在笔记本电脑上安装了 PySpark。当我运行以下程序时,一切正常:
spark = SparkSession.builder.appName('pyspark').getOrCreate()
book_local = spark.read.text("data.txt")
book_local.show()
但是,当我运行以下程序时,出现错误:
spark = SparkSession.builder.appName('pyspark').getOrCreate()
my_grocery_list = [
["Banana", 2, 1.74],
["Apple", 4, 2.04],
["Carrot", 1, 1.09],
["Cake", 1, 10.99],
]
df_grocery_list = spark.createDataFrame(my_grocery_list)
df_grocery_list.show() # This is where the error is thrown
错误信息是:
Py4JJavaError: java.io.IOException: Cannot run program "python3"
设置环境变量后,一切恢复正常。
import os
import sys
from pyspark.sql import SparkSession
os.environ['PYSPARK_PYTHON'] = sys.executable
os.environ['PYSPARK_DRIVER_PYTHON'] = sys.executable
我的问题是,为什么第一个程序运行没有问题,但第二个程序却抛出了 Py4J 错误?第一个程序根本没有使用 Py4J 包吗?
此外,当我尝试用以下代码替换环境变量配置时:
spark = SparkSession.builder.appName('pyspark').config("spark.pyspark.python", sys.executable).getOrCreate()
我仍然遇到错误。
两个脚本之间的行为差异是由于所执行操作的性质和 PySpark 的默认配置造成的。
第一个脚本之所以有效,是因为不需要 Python 工作进程,因为操作仅限于 JVM。
第二个脚本失败,因为它需要 Python 工作进程,而 PySpark 如果没有适当的配置就无法找到 python3 可执行文件。
为什么 .config("spark.pyspark.python", sys.executable) 不起作用?
此方法为工作进程设置 Python 可执行文件,但不会影响驱动程序进程。如果驱动程序进程本身需要 PYSPARK_PYTHON 或 PYSPARK_DRIVER_PYTHON,则除非设置了这些环境变量,否则它仍将失败。要通过 config 正确配置驱动程序和工作进程,您需要同时设置 spark.pyspark.python 和 spark.pyspark.driver.python: