使用dask read_parquet方法过滤会产生不需要的结果

时间:2018-07-09 11:18:48

标签: python dataframe filtering dask fastparquet

我正在尝试使用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-032018-07-04存在。

+-------+------------+------+
|       | dates      | nums |
+-------+------------+------+
| index |            |      |
+-------+------------+------+
| 2     | 2018-07-03 | 3    |
+-------+------------+------+
| 3     | 2018-07-04 | 4    |
+-------+------------+------+
| 4     | 2018-07-05 | 5    |
+-------+------------+------+

我做错什么了吗?还是应该在github上报告?

1 个答案:

答案 0 :(得分:2)

filters关键字是逐行操作(行组是一组数据行的拼写术语,例如数据帧的分区)。它不会在分区内进行任何过滤。

使用filters时,将排除分区,根据该文件中的最大/最小统计信息,给定分区中没有 no 行可以与给定过滤器。例如,如果您指定x> 5,则将排除具有min = 2,max = 4的分区,但不会排除具有min = 2,max = 6的分区,即使后者仅包含满足条件的行。过滤器。

要过滤数据,您仍应使用常规语法

df[df.dates > np.datetime64('2018-07-04')]

除过滤器外,还可以将过滤器的使用视为可选优化。如果没有它,Dask将不得不读取甚至没有良好数据的分区,然后应用该条件,从而导致这些分区没有结果。最好不要加载它们。