创建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
相关产品推荐
相关产品推荐

