如何在for循环中执行spark.read.parquet()生成Azure存储多文件夹DataFrame?
批量读取Parquet文件夹生成对应DataFrame的解决方案
方案:用字典统一管理DataFrames
手动逐个创建DataFrame效率低下,推荐用字典存储每个文件夹对应的DataFrame,既简洁又便于后续维护和批量操作。
代码实现
- 定义基础路径和文件夹列表
# 基础存储路径 base_path = 'abfss://files@mystorageaccount.dfs.core.windows.net/fruits/source_parquet/' # 需要读取的子文件夹名称列表 fruit_folders = ['apples', 'oranges', 'bananas', 'mangoes']
- 循环读取并存储到字典
# 创建字典用于存放所有DataFrame dfs = {} for fruit in fruit_folders: # 拼接完整的文件夹路径 full_path = f"{base_path}{fruit}" # 读取Parquet文件并将结果存入字典,键为文件夹名称 dfs[fruit] = spark.read.option('mergeSchema', 'true').parquet(full_path)
- 使用对应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
相关产品推荐
相关产品推荐

