PySpark读取含多工作表的CSV文件:创建DataFrames遇报错问题
问题解决:读取多工作表文件并生成DataFrames
核心问题说明
首先纠正一个误区:CSV文件没有工作表(Sheet)的概念,你实际要处理的应该是Excel文件(.xlsx/.xls格式)。另外,Spark的csv读取器不支持sheetName参数,你的代码本质只是读取了一个普通CSV生成DataFrame,而DataFrame确实没有keys()方法,这就是报错的直接原因。
正确解决方案
要读取Excel的多工作表并生成对应DataFrames,需要使用Spark的Excel读取依赖,以下是两种可行方案:
方案1:一次性读取所有工作表,再拆分
首先确保你的Spark环境引入了Excel读取依赖(以Scala 2.12、Spark 3.x为例,依赖坐标:com.crealytics:spark-excel_2.12:0.14.0),然后通过参数配置读取所有工作表:
# 读取所有工作表,自动添加_sheet_name列标记所属表 df_all = self.spark.read.option("header", "true") \ .option("sheetName", None) \ .format("com.crealytics.spark.excel") \ .load(file_path) # 按工作表名拆分,生成字典存储每个表的DataFrame sheet_dfs = {} for sheet_name in df_all.select("_sheet_name").distinct().rdd.flatMap(lambda x: x).collect(): sheet_dfs[sheet_name] = df_all.filter(df_all["_sheet_name"] == sheet_name).drop("_sheet_name") # 打印所有工作表名 print(sheet_dfs.keys())
方案2:先获取所有工作表名,再逐个读取
如果需要先获取工作表名再单独读取,可以借助pandas先获取表名(需要安装pandas和openpyxl依赖):
import pandas as pd # 用pandas获取所有工作表名 xls = pd.ExcelFile(file_path) sheet_names = xls.sheet_names print(sheet_names) # 循环读取每个工作表生成DataFrame sheet_dfs = {} for sheet in sheet_names: sheet_dfs[sheet] = self.spark.read.option("header", "true") \ .format("com.crealytics.spark.excel") \ .option("sheetName", sheet) \ .load(file_path)
原代码错误点总结
- 混淆文件格式:CSV是纯文本文件,无工作表结构;只有Excel文件才有多工作表概念。
- 使用错误读取器:
spark.read.csv不支持sheetName参数,该参数属于Excel读取器专属配置。 - 错误调用方法:DataFrame没有
keys()方法,若要获取列名用df.columns,但这里你需要的是工作表名,该方法完全不适用。
内容的提问来源于stack exchange,提问作者Adrita Sharma
相关产品推荐
相关产品推荐

