Jupyter中导入.xlsx文件并通过SQL操作失败的求助
大家好,我最近尝试在Jupyter中导入Database.xlsx文件,想用SQL命令来操作它,但运行代码后遇到了AttributeError,实在搞不定,想请大家帮忙分析一下问题所在。
我使用的代码如下:
!pip install pandas==1.3.3 import pandas as pd from pyspark.sql import SparkSession # Initialize Spark session with Arrow disabled spark = SparkSession.builder \ .appName("ExcelToSpark") \ .config("spark.sql.execution.arrow.pyspark.enabled", "false") \ .getOrCreate() # Read the Excel file using Pandas pdf = pd.read_excel('/home/jovyan/Database.xlsx', sheet_name='DB') # Convert Pandas DataFrame to PySpark DataFrame sdf = spark.createDataFrame(pdf) sdf.createOrReplaceTempView('DB')
运行后出现的错误信息:
AttributeError Traceback (most recent call last)
/tmp/ipykernel_222/4258738796.py in ?()
10 # Read the Excel file using Pandas
11 pdf = pd.read_excel('/home/jovyan/Database.xlsx', sheet_name='DB')
12
13 # Convert Pandas DataFrame to PySpark DataFrame
---> 14 sdf = spark.createDataFrame(pdf)
可能的原因及解决办法
作为经常处理这类问题的开发者,我整理了几个大概率能解决问题的方向:
缺少Excel读取依赖库
Pandas读取.xlsx文件需要依赖openpyxl库,如果你没安装的话,可能会在读取时出问题(虽然报错显示在转换步骤,但读取环节的隐性问题也可能传导过来)。先安装这个库试试:!pip install openpyxlPandas与PySpark版本不兼容
你指定安装了pandas==1.3.3,但这个版本可能和你当前使用的PySpark版本不匹配,导致spark.createDataFrame()无法正常解析Pandas DataFrame。先查看你的PySpark版本:import pyspark print(pyspark.__version__)然后根据PySpark官方文档推荐的版本对应关系,调整Pandas的安装版本。比如PySpark 3.2.x推荐Pandas 1.0.0~1.4.x,PySpark 3.3.x则支持到Pandas 1.5.x。
直接使用PySpark读取Excel(更稳定)
其实不需要通过Pandas中转,直接用PySpark的专用Excel读取库会更可靠,还能避免版本兼容问题。步骤如下:- 先安装依赖库:
!pip install spark-excel - 修改代码为:
from pyspark.sql import SparkSession spark = SparkSession.builder \ .appName("ExcelToSpark") \ .config("spark.sql.execution.arrow.pyspark.enabled", "false") \ .getOrCreate() # 直接读取Excel为PySpark DataFrame sdf = spark.read.format("com.crealytics.spark.excel") \ .option("header", "true") # 如果Excel有表头的话开启 .option("sheetName", "DB") \ .load("/home/jovyan/Database.xlsx") sdf.createOrReplaceTempView('DB')
这样直接得到的PySpark DataFrame可以直接用于SQL操作,不需要转换环节。
- 先安装依赖库:
验证文件路径和工作表名称
最后再确认一下:/home/jovyan/Database.xlsx这个路径是否正确,工作表名称DB是否完全匹配(注意大小写敏感),文件有没有损坏或者权限问题。
备注:内容来源于stack exchange,提问作者Fabrizio Ferrari

