使用 PyArrow 从多个文件中读取分区的镶木地板数据集,并根据文件名添加分区键
Read a partitioned parquet dataset from multiple files with PyArrow and add a partition key based on the filename
我有一堆 parquet
文件,每个文件都包含我的数据集的一个子集。假设文件名为 data-N.parquet
,其中 N
是一个整数。
我可以全部阅读并随后转换为 pandas
数据帧:
files = glob.glob("data-**.parquet")
ds = pq.ParquetDataset(
files,
metadata_nthreads=64,
).read_table(use_threads=True)
df = ds.to_pandas()
这很好用。它想要的是在最终数据框中增加一列,指示数据来自哪个文件。
据我了解,ds
数据是分区的,每个文件一个分区。所以这将是在数据框中包含分区键的问题。
这样可行吗?
分区键目前包含在数据框中。但是,所有现有的分区方案都使用目录名作为键。因此,如果您的数据是 /N/data.parquet
或 /batch=N/data.parquet
,就会发生这种情况(您需要在读取数据集时提供分区对象)。
今天(在 pyarrow 中)无法在返回的结果中获取文件名。
我有一堆 parquet
文件,每个文件都包含我的数据集的一个子集。假设文件名为 data-N.parquet
,其中 N
是一个整数。
我可以全部阅读并随后转换为 pandas
数据帧:
files = glob.glob("data-**.parquet")
ds = pq.ParquetDataset(
files,
metadata_nthreads=64,
).read_table(use_threads=True)
df = ds.to_pandas()
这很好用。它想要的是在最终数据框中增加一列,指示数据来自哪个文件。
据我了解,ds
数据是分区的,每个文件一个分区。所以这将是在数据框中包含分区键的问题。
这样可行吗?
分区键目前包含在数据框中。但是,所有现有的分区方案都使用目录名作为键。因此,如果您的数据是 /N/data.parquet
或 /batch=N/data.parquet
,就会发生这种情况(您需要在读取数据集时提供分区对象)。
今天(在 pyarrow 中)无法在返回的结果中获取文件名。