dask версия 1.1.4
Я был застигнут врасплох тем, что dask.dataframe.head () не ведет себя подобно пандам.
Фильтрованный 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())
Два выхода не идентичны.
UserWarning, когда head (n) возвращает меньше n строк, предлагает увеличить npartitions, что решает проблему:
.../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)))
Но я бы предпочел не иметь это в виду каждый раз, когда использую сумку. Кроме того, кажется, что производительность значительно снижается, если npartitions всегда установлен равным -1, даже если большинство разделов пустые.
Мой вопрос: в чем причина этого конкретного дизайна? Можно ли сопоставить поведение панд, просто проходя через разделы, пока не будут собраны n строк или не исчерпаны разделы?