如何用Apache Beam Python SDK读取按iso_week分区的Parquet文件?
读取分区Parquet文件的解决方案
方法1:用递归通配符直接匹配所有Parquet文件
这是最直接的解决方式,通过**递归遍历所有子目录,精准匹配所有.parquet文件:
import apache_beam as beam with beam.Pipeline() as pipeline: data = ( pipeline | "读取分区Parquet数据" >> beam.io.ReadFromParquet("data_to_read/**/*.parquet") )
**会自动遍历data_to_read下所有层级的子目录,*.parquet筛选出目标文件,这样就能一次性读取所有分区里的数据。
方法2:手动提取分区信息并加入数据
如果需要把分区键(比如iso_week)作为字段添加到每条数据中,可结合FileIO实现:
import apache_beam as beam import re def read_with_partition(file_metadata): # 从文件路径中提取iso_week的值 match_result = re.search(r'iso_week=([^/]+)', file_metadata.path) iso_week = match_result.group(1) if match_result else None # 读取单个Parquet文件并添加分区字段 with beam.io.filesystems.FileSystems.open(file_metadata.path) as f: reader = beam.io.parquetio.ParquetFileReader(f) for record in reader.read_all(): record['iso_week'] = iso_week yield record with beam.Pipeline() as pipeline: data = ( pipeline | "匹配分区目录下的Parquet文件" >> beam.io.FileIO.match("data_to_read/iso_week=*/*.parquet") | "读取文件并添加分区信息" >> beam.FlatMap(read_with_partition) )
原方法报错原因
你之前用的data_to_read/*匹配的是data_to_read下的一级子目录(即iso_week=2023-W40、iso_week=2023-W41),而非目录内的Parquet文件。ReadFromParquet需要直接指向Parquet文件路径,因此会提示找不到目标文件。
内容的提问来源于stack exchange,提问作者Stefano Castoldi
相关产品推荐
相关产品推荐

