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

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)

原代码错误点总结

  1. 混淆文件格式:CSV是纯文本文件,无工作表结构;只有Excel文件才有多工作表概念。
  2. 使用错误读取器:spark.read.csv不支持sheetName参数,该参数属于Excel读取器专属配置。
  3. 错误调用方法:DataFrame没有keys()方法,若要获取列名用df.columns,但这里你需要的是工作表名,该方法完全不适用。

内容的提问来源于stack exchange,提问作者Adrita Sharma

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 01:25:07