通过Databricks读取ADLS Gen2多文件夹数据生成单目标文件的实现方法
Databricks 合并ADLS Gen2多分区Parquet为单文件方案
步骤1:读取全量Parquet数据
假设你已创建的ADLS Gen2挂载点路径为/mnt/<你的挂载点名称>,目录结构为按年月分层(支持Hive分区格式/year=2023/month=10/或普通年月格式/2023/10/):
# 替换为你的实际挂载点根路径 base_path = "/mnt/替换为你的挂载点名称" # 写法1:适配任意年月目录结构,递归读取所有parquet文件 df = spark.read.option("recursiveFileLookup", "true").parquet(base_path) # 写法2:如果目录是Hive分区命名(年=xxxx/月=xx 或 year=xxxx/month=xx),可自动识别分区为数据列 # df = spark.read.parquet(base_path)
如果需要从非Hive格式的路径中提取年月作为列,可新增如下逻辑:
from pyspark.sql.functions import input_file_name, split df = df.withColumn("file_path", input_file_name()) \ .withColumn("year", split(split(df["file_path"], "/")[3], "=")[1]) \ .withColumn("month", split(split(df["file_path"], "/")[4], "=")[1])
步骤2:输出单个全量文件
利用coalesce(1)将分布式数据合并为单分区后输出:
# 替换为你的目标输出路径,建议放在ADLS挂载目录下 output_path = "/mnt/替换为你的挂载点名称/合并后全量数据" # 输出为parquet格式,可替换为csv等其他格式,csv可加.option("header","true")保留表头 df.coalesce(1).write.mode("overwrite").parquet(output_path)
输出目录下名称以
part-00000开头的parquet文件即为合并后的全量单文件,同目录下的_SUCCESS、CRC校验文件为Spark输出标记文件,无需使用可直接删除。
注意事项
- 若全量数据规模过大(超过10G)不建议强行输出单文件,会大幅增加读写耗时和Driver节点内存压力,优先保留多分区存储更适合大数据场景
- 如需仅合并指定时段数据,可读取完成后添加过滤条件,示例:
df.filter((df.year == 2023) & (df.month >= 6))即可仅合并2023年下半年数据 - 单文件输出后可根据业务需求重命名为固定名称,方便后续读取调用
内容的提问来源于stack exchange,提问作者Arun
相关产品推荐
相关产品推荐

