Почему dask head () по умолчанию проверяет только первый раздел? - PullRequest
0 голосов
/ 03 июля 2019

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 строк или не исчерпаны разделы?

1 Ответ

1 голос
/ 03 июля 2019

Мой вопрос: в чем причина этого конкретного дизайна?Можно ли сопоставить поведение панд путем простого обхода разделов до тех пор, пока не будут собраны n строк или не исчерпаны разделы?

В некоторых случаях да, то, что вы предлагаете, будет очень выполнимо, но не во всех,Например, рассмотрим случай, когда ваш фрейм данных является результатом операции сортировки.Мы можем вычислить первый раздел, понимая, что этого недостаточно, но, к сожалению, на данный момент мы отбросили все предыдущие данные.

Должны ли мы пересчитать полный отсортированный набор данных?Это дорого

Стоит ли рассчитывать несколько разделов на всякий случай?Это может или не может уместиться в памяти.

В конце концов, единственное, что мы можем сделать, это предупредить и сообщить пользователю, что происходит, чтобы он мог самостоятельно принять взвешенное решение.

...