如何将Azure DataLake多子文件夹中的CSV数据加载到Azure Databricks的DataFrame中
解决方案:加载Azure DataLake多层子文件夹中的CSV到Databricks DataFrame
我来帮你搞定这个问题!你当前的代码没法正常运行,核心原因是路径匹配的范围不够——/FolderName/*只能匹配主文件夹下直接的子目录(也就是YearName2019、YearName2020这类年份文件夹),但没法递归深入到里面的Month子文件夹去读取CSV文件。下面给你几个可行的解决方案:
方案1:使用递归通配符**(最简单直接)
Spark支持用**来匹配任意层级的子目录,你只需要把路径改成匹配所有层级下的CSV文件就行:
df = spark.read.load( '/FolderName/**/*.csv', format='csv', sep=',', header='True', inferSchema=True )
这里**会遍历主文件夹下所有层级的子目录,*.csv则精准匹配所有CSV文件,这样就能把所有年份、月份文件夹里的CSV都加载进来。
方案2:精准匹配层级通配符
如果你想更精准地控制匹配范围(比如只加载特定格式的年份/月份文件夹),可以用多层通配符来对应你的目录结构:
df = spark.read.load( '/FolderName/YearName*/Month*/*.csv', format='csv', sep=',', header='True', inferSchema=True )
这个路径会匹配所有以YearName开头的文件夹,再匹配里面所有以Month开头的文件夹,最后读取其中的CSV文件,完全贴合你的目录结构。
方案3:启用递归文件查找选项
你也可以保持原来的基础路径,通过添加recursiveFileLookup选项让Spark递归查找子目录里的文件:
df = spark.read.option("recursiveFileLookup", "true") \ .load('/FolderName/*', format='csv', sep=',', header='True', inferSchema=True)
这个选项会告诉Spark:不要只停留在当前匹配的目录,要递归遍历所有子目录去查找符合格式的文件。
额外注意事项
- 确保所有目标文件都是CSV格式,避免加载到其他杂项文件;如果有非CSV文件在这些目录里,可以用
pathGlobFilter选项进一步过滤,比如.option("pathGlobFilter", "*.csv")。 - 如果不同CSV文件的 schema 不一致,
inferSchema=True可能会导致读取异常,建议提前定义统一的schema,用.schema(your_defined_schema)来替代自动推断。 - 确认你的Databricks集群已经配置了正确的权限,能够访问Azure DataLake Storage中的这些文件夹。
内容的提问来源于stack exchange,提问作者shubham kumar
相关产品推荐
相关产品推荐

