为啥在索引 Parquet 文件上计算形状如此缓慢?
Posted
技术标签:
【中文标题】为啥在索引 Parquet 文件上计算形状如此缓慢?【英文标题】:Why is computing the shape on an indexed Parquet file so slow in dask?为什么在索引 Parquet 文件上计算形状如此缓慢? 【发布时间】:2020-03-20 06:29:12 【问题描述】:我从位于同一文件夹中的多个 Parquet 文件创建了一个 Parquet 文件。每个文件对应一个分区。
Parquet 文件是在不同的进程中创建的(使用 Python concurrent.futures
)。这是我在一个进程中运行的代码示例:
# `df` is a standard Pandas DataFrame with
# 22 columns of different types and at most 100e3 rows.
# Set the index
df.set_index("cid", inplace=True)
# Write to single file
fastparquet.write(fpath, df, compression='snappy, file_scheme='simple)
df
最多包含 100e3
行(和 22 列),并在整数索引(称为 cid
)上编制索引。
然后我使用以下方法创建了两个元数据文件:
# `data_paths` contains the list of all the Parquet data files
# created in multiple processes.
fastparquet.writer.merge(data_paths, verify_schema=True)
确实,_metadata
和 _common_metadata
在包含所有 Parquet 文件的文件夹中正确创建。
我天真地认为,由于数据已编入索引和/或具有元数据文件,因此获取数据大小等基本信息应该很快。例如,以下内容需要永远:
import dask.dataframe as ds
# `dataset_path` is the path to the folder
# containing all the Parquet files created above
# and the metadata files.
# It contains ~100-200 individual Parquet files
# for a total of ~60,000,000 rows
data = df.read_parquet(dataset_path)
data.shape[0].compute()
那是例外吗?
另请注意,大多数列是int64
、float64
,少数是object
(string
,大小不一。
【问题讨论】:
什么是data
?你能解释更多关于df
是如何创建的吗?如果数据是从多个期货对象创建的,那么您对data.shape
的调用可能需要从原始concurrent.futures
对象进行计算,或者最坏的情况是从磁盘计算。也许打电话给df = df.persist()
?
我已经编辑了我的问题。我希望现在更清楚了。
【参考方案1】:
就个人而言,我直接使用 fastparquet 访问 Parquet 元数据,而不是 Dask。
元数据中有很多数据,因此值得一玩。
我进一步指出,如果您有很多文件,您可以将 fastparquet 操作放在延迟函数中,以使用 dask 并行读取 parquet 元数据。举个例子:
@dask.delayed
def read_pf(path_to_parquet_file):
pf = fastparquet.ParquetFile(path_to_parquet_file)
all_stats = pf.statistics.copy()
all_info = pf.info.copy()
【讨论】:
【参考方案2】:不幸的是,从元数据中提取数据帧长度的优化尚不存在。相反,dask 将每个分区加载到内存中并测量其长度。您会注意到,如果您选择单个列(或索引),这种情况会发生得更快:
len(data[onecolumn])
但是,对于 parquet 的特殊情况,您是完全正确的,长度是事先从一组或多组元数据中知道的,如果能够一口气得到它,那就太好了。请随时在 Dask 问题跟踪器上请求此功能。目前,您可以使用fastparquet.ParquetFile
的count
和columns
属性。
【讨论】:
至少我的理解是正确的,这是一个实现问题。谢谢。我将提交功能请求。以上是关于为啥在索引 Parquet 文件上计算形状如此缓慢?的主要内容,如果未能解决你的问题,请参考以下文章
在简单的逐行计算任务中,为啥犰狳与 C 风格的数组相比如此缓慢
为啥我的 ember-cli 构建时间在 Windows 上如此缓慢?