使用 dask read_parquet 方法过滤会产生不需要的结果
filtering with dask read_parquet method gives unwanted results
我正在尝试使用 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')
当我阅读并过滤 'test_par'
文件夹中的 dates
列时,它似乎不起作用
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 上报告吗?
filters
关键字是行组操作(行组是一组数据行的镶木地板术语,如数据框的分区)。它不会在分区内进行任何过滤。
当您使用 filters
时,您将排除分区,根据文件中的 max/min 统计,其中有 no 行可以匹配给定过滤器的给定分区。例如,如果您指定 x>5,则将排除具有 min=2,max=4 的分区,但不会排除具有 min=2,max=6 的分区,即使后者仅包含满足过滤器。
要过滤数据,您仍然应该使用通常的语法
df[df.dates > np.datetime64('2018-07-04')]
除了过滤器,并将过滤器的使用视为可选的优化。没有它,Dask 甚至必须读取没有好数据的分区,然后应用条件,导致这些分区没有结果。如果可能,最好不要加载它们。
我正在尝试使用 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')
当我阅读并过滤 'test_par'
文件夹中的 dates
列时,它似乎不起作用
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 上报告吗?
filters
关键字是行组操作(行组是一组数据行的镶木地板术语,如数据框的分区)。它不会在分区内进行任何过滤。
当您使用 filters
时,您将排除分区,根据文件中的 max/min 统计,其中有 no 行可以匹配给定过滤器的给定分区。例如,如果您指定 x>5,则将排除具有 min=2,max=4 的分区,但不会排除具有 min=2,max=6 的分区,即使后者仅包含满足过滤器。
要过滤数据,您仍然应该使用通常的语法
df[df.dates > np.datetime64('2018-07-04')]
除了过滤器,并将过滤器的使用视为可选的优化。没有它,Dask 甚至必须读取没有好数据的分区,然后应用条件,导致这些分区没有结果。如果可能,最好不要加载它们。