Dask DataFrame .head() 索引后非常慢

AZh*_*hao 4 dask

不可重现,但有人可以填写为什么 .head() 调用在索引后会大大减慢吗?

import dask.dataframe as dd
df = dd.read_parquet("Filepath")
df.head() # takes 10 seconds

df = df.set_index('id')

df.head() # takes 10 minutes +
Run Code Online (Sandbox Code Playgroud)

mdu*_*ant 5

如文档中所述,set_index根据新索引对数据进行排序,以便沿该索引的划分将数据拆分为其逻辑分区。排序需要额外的时间,但执行后会使对该索引的操作速度更快。head()原始文件上将从光盘上的第一个数据块获取,而不考虑任何顺序。

您可以使用关键字index=to read_parquet(也许数据本身已经排序了?)或使用来设置索引,而无需这种排序.map_partitions(lambda df: df.set_index(..)),但这提出了一个明显的问题,您为什么要烦恼,您想要实现什么目标?如果数据已经排序,那么您也可以使用set_index(.., sorted=True),甚至可能使用divisions关键字,如果您碰巧有信息 - 这不需要排序,并且相应地更快。