Python 为什么dask head()默认只检查第一个分区?

Python 为什么dask head()默认只检查第一个分区?,python,pandas,dataframe,dask,Python,Pandas,Dataframe,Dask,dask版本1.1.4 dask.dataframe.head()的行为与pandas不同,这让我措手不及 筛选的dask.dataframe似乎将行保留在原始分区中。若一个分区的所有行都被过滤掉了,那个么该分区将保留为空,但仍然保留在生成的dask.dataframe中。如果len(第一个分区)

dask版本1.1.4

dask.dataframe.head()的行为与pandas不同,这让我措手不及

筛选的dask.dataframe似乎将行保留在原始分区中。若一个分区的所有行都被过滤掉了,那个么该分区将保留为空,但仍然保留在生成的dask.dataframe中。如果len(第一个分区)
import dask
import dask.dataframe as dd

dd = dask.datasets.timeseries()

# Original partitions lengths
print(dd.map_partitions(len).compute())

# Since len(first partition) > 5, head() works fine
print(dd.head())

# Now we filter data
dd_filter = dd[dd['id'] <= 870]

# Observe the empty partitions and those with len < 5
print(dd_filter.map_partitions(len).compute())

# Note the difference between the following two outputs:
print(dd_filter.head())
print(dd_filter.compute().head())
但我不希望每次使用dask时都记住这一点。此外,如果npartitions始终设置为-1,则即使大多数分区为空,性能也会受到显著影响

我的问题是,这种特殊设计背后的原因是什么?是否可以通过简单地遍历分区,直到收集到n行或分区用尽,来匹配行为

我的问题是,这种特殊设计背后的原因是什么?是否可以通过简单地遍历分区,直到收集到n行或分区用尽,来匹配行为

在某些情况下,是的,你的建议是非常可行的,但不是全部。例如,考虑数据文件是排序操作的结果的情况。我们可以计算第一个分区,意识到这是不够的,但不幸的是,在这一点上,我们已经扔掉了所有以前的数据

我们应该重新计算完整排序的数据集吗?那太贵了

我们应该计算几个分区以防万一吗?可能在内存中,也可能不在内存中

在一天结束时,我们唯一能做的就是警告并告诉用户发生了什么,这样他们就可以自己做出明智的决定

.../dask/dataframe/core.py:4494: UserWarning: Insufficient elements for `head`. 5 elements requested, only 0 elements available. Try passing larger `npartitions` to `head`.
  warnings.warn(msg.format(n, len(r)))