You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

创建PySpark DataFrame时抛出PySparkTypeError问题求助

PySpark通过数组/字典创建DataFrame报错,但读取CSV正常的解决方案

问题描述

尝试通过数组或字典创建PySpark DataFrame时,两种方式均抛出相同的Py4JJavaError异常,但使用CSV文件创建DataFrame却能正常运行。

代码示例

from pyspark.sql import SparkSession
from pyspark.sql.functions import col

spark = SparkSession.builder.appName("example").getOrCreate()

simpleData1 = [
(1, 'firstname1', 'lastname1', 'address1', -97),
(2, 'firstname1', 'lastname1', 'address1', -23),
(3, 'firstname2', 'lastname2', 'address2', -23),
(4, 'firstname2', 'lastname2', 'address2', -97)
]
columns = ["id","name", "last", "address", "bookID"]
books = [-23, -44, -97, -32, -57, -76]

simpleData2 = [
{"id":1, "name":'firstname1', "last":'lastname1', "address":'address1', "bookID":-97},
{"id":2, "name":'firstname1', "last":'lastname1', "address":'address1', "bookID":-23},
{"id":3, "name":'firstname2', "last":'lastname2', "address":'address2', "bookID":-23},
{"id":4, "name":'firstname2', "last":'lastname2', "address":'address2', "bookID":-97}
]

# 尝试用数组创建
df1 = spark.createDataFrame(simpleData1).toDF(*columns)
# 尝试用字典创建
df2 = spark.createDataFrame(simpleData2)

df1.show()
df2.show()

报错信息(起始部分)

Py4JJavaError                             Traceback (most recent call last)
Cell In[2], line 36
     34 df = spark.createDataFrame(simpleData).toDF(*columns)
     35 #df = spark.createDataFrame(simpleData2)
---> 36 df.show()

File C:\devTools\Anaconda\Lib\site-packages\pyspark\sql\dataframe.py:899, in DataFrame.show(self, n, truncate, vertical)
    893     raise PySparkTypeError(
    894         error_class="NOT_BOOL",
    895         message_parameters={"arg_name": "vertical", "arg_type": type(vertical).__name__},
    896     )
    898 if isinstance(truncate, bool) and truncate:
--> 899     print(self._jdf.showString(n, 20, vertical))
    900 else:
    901     try:

已尝试方案

  • 安装findspark
  • 在PySpark Shell运行时提示找不到Python,禁用应用执行别名后仍无法解决
  • 读取CSV文件创建DataFrame的操作在PySpark Shell和Jupyter Notebook中均正常
  • 尝试拼写错误的createDataFrom方法,问题依旧

解决方案

核心问题是PySpark无法正确定位Python解释器路径:读取CSV是纯Java实现逻辑,无需调用Python;而通过数组/字典创建DataFrame需要触发Python相关的底层操作,路径缺失就会抛出异常。可按以下步骤解决:

1. 创建SparkSession时指定Python路径

在初始化SparkSession时,直接通过配置参数指定Python解释器的完整路径:

spark = SparkSession.builder \
    .appName("example") \
    .config("spark.driver.python", "C:/devTools/Anaconda/python.exe") \
    .config("spark.executor.python", "C:/devTools/Anaconda/python.exe") \
    .getOrCreate()

替换为你实际的Python安装路径(如Anaconda的python.exe或系统Python路径)。

2. 配置系统环境变量

  • 添加PYSPARK_PYTHON环境变量,值为Python解释器的完整路径
  • 添加PYSPARK_DRIVER_PYTHON环境变量,值同上
  • 重启运行环境(Jupyter Notebook/PySpark Shell)后再测试

3. 检查版本兼容性

确保PySpark与Python版本匹配:

  • PySpark 3.3+ 支持Python 3.7-3.10
  • PySpark 3.4+ 支持Python 3.7-3.11
    版本不兼容时,升级或降级对应组件。

4. 修正代码错误

注意createDataFrom是错误方法名,正确的创建方法为createDataFrame。

内容的提问来源于stack exchange,提问作者Mojdeh Ebrahimi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 13:30:31