如何用PySpark无循环获取指定路径下2023年的所有CSV文件
解决方案
PySpark支持通过通配符路径直接匹配目标文件,完全不需要循环。针对你的目录结构,有两种常用方法:
方法1:使用通配符精准定位
直接在读取路径中用*匹配中间层级的子文件夹,精准抓取Year=2023下的所有CSV:
from pyspark.sql import SparkSession spark = SparkSession.builder.appName("Read2023CSVs").getOrCreate() # 路径中的*会匹配folder4下所有子文件夹(如folder41、folder42) df = spark.read.csv("/folder1/folder2/folder3/folder4/*/Year=2023/*.csv", header=True, inferSchema=True) # 验证读取结果 df.count() df.show(5)
这里的*是通配符,代表任意名称的目录,PySpark会自动遍历符合规则的路径,只读取目标年份下的CSV文件。
方法2:利用分区自动发现(推荐)
你的目录是标准的分区格式(Year=xxx),PySpark能自动识别分区列,读取后直接过滤更高效:
from pyspark.sql import SparkSession spark = SparkSession.builder.appName("ReadPartitionedData").getOrCreate() # 读取folder4下所有子目录,Spark会自动识别Year分区列 df = spark.read.csv("/folder1/folder2/folder3/folder4/*/", header=True, inferSchema=True) # 过滤出Year=2023的数据 df_2023 = df.filter(df.Year == "2023") # 验证结果 df_2023.printSchema() df_2023.count()
这种方法的优势是Spark会利用分区信息减少不必要的数据扫描,性能优于通配符匹配,后续切换年份也只需修改过滤条件即可。
注意:如果CSV无表头,去掉header=True;若需指定固定Schema,可替换为.schema(自定义Schema)。
内容的提问来源于stack exchange,提问作者ninja_minida
相关产品推荐
相关产品推荐

