我对使用pyArrow很陌生,我正在尝试读取Parquet文件,但过滤我正在加载的数据。我有一个end_time列,当我尝试根据某个日期进行过滤时,它工作得很好,我可以过滤以仅获取与我的日期匹配的行。
import pyarrow as pa
import pyarrow.parquet as pq
from datetime import datetime
last_updated_at = datetime(2021,3,5,21,0,23)
table_ad_sets_ongoing = pq.read_table('export/facebook.parquet', filters = [('end_time', '>', last_updated_at)])
print(table_ad_sets_ongoing.num_rows)
但我有时也有一个空值在这个end_time字段。所以我尝试过滤这种方式
import pyarrow as pa
import pyarrow.parquet as pq
from datetime import datetime
table_ad_sets_ongoing = pq.read_table('export/facebook.parquet', filters = [('end_time', '=', None)])
print(table_ad_sets_ongoing.num_rows)
但是结果总是0,即使我实际上有一些带有这个空值的行。经过一些挖掘,我怀疑这与一个默认为“drop”值的null_selection_behavior有关,因此它跳过了空值。https://arrow.apache.org/docs/python/generated/pyarrow.compute.filter.html#pyarrow.compute.filter我想我应该将此参数添加到“emit_null”,但我找不到方法。
任何想法?
谢谢你们
我终于找到了我问题的答案。答案来自箭头github(我这边不早点看它是愚蠢的)。https://github.com/apache/arrow/issues/9160
要过滤空字段,我们必须这样使用它:
import pyarrow as pa
import pyarrow.parquet as pq
import pyarrow.dataset as ds
from datetime import datetime
table_ad_sets_ongoing = pq.read_table('export/facebook.parquet', filters=~ds.field("end_time").is_valid())
print(table_ad_sets_ongoing.num_rows)