Фильтрация методом dask read_parquet дает нежелательные результаты
Я пытаюсь читать файлы паркета, используяdask
read_parquet
метод и filters
kwarg. однако иногда он не фильтруется в соответствии с заданным условием.
Пример: создание и сохранение фрейма данных с dates
колонка
import pandas as pd
import numpy as np
import dask.dataframe as dd
nums = range(1,6)
dates = pd.date_range('2018-07-01', periods=5, freq='1d')
df = pd.DataFrame({'dates':dates, 'nums': nums})
ddf = dd.from_pandas(df, npartitions=3).to_parquet('test_par', engine = 'fastparquet')
когда я читаю и фильтрую dates
колонка из 'test_par'
папка не работает
filters=[('dates', '>', np.datetime64('2018-07-04'))]
df = dd.read_parquet('test_par', engine='fastparquet', filters=filters).compute()
как вы можете видеть на выходе, 2018-07-03
а также 2018-07-04
присутствуют.
+-------+------------+------+
| | dates | nums |
+-------+------------+------+
| index | | |
+-------+------------+------+
| 2 | 2018-07-03 | 3 |
+-------+------------+------+
| 3 | 2018-07-04 | 4 |
+-------+------------+------+
| 4 | 2018-07-05 | 5 |
+-------+------------+------+
Я делаю что-то неправильно? или я должен сообщить об этом на github?
1 ответ
filters
Ключевое слово - это действие по группам строк (группа строк - это термин для набора строк данных, например раздел для фрейма данных). Он не выполняет никакой фильтрации внутри разделов.
Когда вы используете filters
, вы будете исключать разделы, в которых, согласно статистике max/min в файле, в данном разделе нет строк, которые могли бы соответствовать данному фильтру. Например, если вы укажете x>5, раздел с min=2,max=4 будет исключен, а раздел с min=2,max=6 не будет, даже если последний будет содержать только несколько строк, которые соответствуют фильтр.
Чтобы отфильтровать данные, вы все равно должны использовать обычный синтаксис
df[df.dates > np.datetime64('2018-07-04')]
в дополнение к фильтру и просмотра использования фильтров в качестве дополнительной оптимизации. Без этого Dask должен был бы прочитать даже разделы без хороших данных, а затем применить условие, что не дало бы результатов для этих разделов. Лучше не загружать их, если это возможно.