为什么dask head()默认情况下仅检查第一个分区?

时间:2019-07-03 09:53:44

标签: python pandas dataframe dask

黄昏版本1.1.4

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

经过过滤的dask.dataframe似乎将行保留在原始分区中。如果将分区的所有行过滤掉,则分区将保留为空,但仍保留在结果dask.dataframe中。如果len(第一个分区)

Me.Controls("MyTextbox").ControlSource = "valX"

两个输出不相同。

head(n)返回少于n行的UserWarning确实建议增加npartitions,这解决了问题:

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行或分区耗尽来匹配熊猫的行为?

1 个答案:

答案 0 :(得分:1)

  

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

在某些情况下,是的,您的建议将非常可行,但并非全部。例如,考虑数据框是排序操作的结果的情况。我们可以计算出第一个分区,意识到这还不够,但是很遗憾,在这一点上,我们已经丢掉了所有先前的数据。

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

我们是否应该计算一些分区以防万一?这可能适合也可能不适合内存。

最终,我们唯一能做的就是警告并告诉用户发生了什么事,以便他们可以自己做出明智的决定。