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

如何在for循环中执行spark.read.parquet()生成Azure存储多文件夹DataFrame?

批量读取Parquet文件夹生成对应DataFrame的解决方案

方案:用字典统一管理DataFrames

手动逐个创建DataFrame效率低下,推荐用字典存储每个文件夹对应的DataFrame,既简洁又便于后续维护和批量操作。

代码实现

  1. 定义基础路径和文件夹列表
# 基础存储路径
base_path = 'abfss://files@mystorageaccount.dfs.core.windows.net/fruits/source_parquet/'
# 需要读取的子文件夹名称列表
fruit_folders = ['apples', 'oranges', 'bananas', 'mangoes']
  1. 循环读取并存储到字典
# 创建字典用于存放所有DataFrame
dfs = {}
for fruit in fruit_folders:
    # 拼接完整的文件夹路径
    full_path = f"{base_path}{fruit}"
    # 读取Parquet文件并将结果存入字典,键为文件夹名称
    dfs[fruit] = spark.read.option('mergeSchema', 'true').parquet(full_path)
  1. 使用对应DataFrame
    后续需要调用某个DataFrame时,直接通过字典的键获取:
# 查看apples文件夹对应的DataFrame数据
dfs['apples'].show()
# 打印oranges文件夹对应的DataFrame schema
dfs['oranges'].printSchema()

进阶:自动获取文件夹列表

如果不确定所有子文件夹名称,可以通过dbutils.fs.ls动态获取目录下的所有文件夹,无需手动维护列表:

# 获取基础路径下的所有目录项
folder_items = dbutils.fs.ls(base_path)
# 过滤出文件夹并提取名称(去除路径末尾的斜杠)
fruit_folders = [item.name.rstrip('/') for item in folder_items if item.isDir()]

# 循环读取逻辑和之前一致
dfs = {}
for fruit in fruit_folders:
    full_path = f"{base_path}{fruit}"
    dfs[fruit] = spark.read.option('mergeSchema', 'true').parquet(full_path)

为什么不推荐动态创建独立变量?

不建议用exec()等方式生成df_apples这类独立变量,原因:

  • 代码可读性差,后续难以追踪变量来源
  • 变量过多会污染命名空间
  • 批量操作这些变量非常繁琐,而字典可直接遍历处理

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 22:12:43