2

中的partition_filter参数wr.s3.read_parquet()未能过滤 S3 上的分区拼花数据集。这是一个可重现的示例(可能需要正确配置的boto3_session参数):

数据集设置:

import pandas as pd
import awswrangler as wr
import boto3

s3_path = "s3://bucket-name/folder"

df = pd.DataFrame({"val": [1,3,2,5], "date": ['2021-04-01','2021-04-01','2021-04-02','2021-04-03']})

wr.s3.to_parquet(
    df = df,
    path = s3_path,
    dataset = True,
    partition_cols = ['date']
)
#> {'paths': ['s3://bucket-name/folder/date=2021-04-01/38399541e6fe4fa7866181479dd28e8e.snappy.parquet',
#>   's3://bucket-name/folder/date=2021-04-02/0a556212b5f941c7aa3c3775d2387419.snappy.parquet',
#>   's3://bucket-name/folder/date=2021-04-03/cb71397bea104787a50a90b078d564bd.snappy.parquet'],
#>  'partitions_values': {'s3://aardvark-gdelt/headlines/date=2021-04-01/': ['2021-04-01'],
#>   's3://bucket-name/folder/date=2021-04-02/': ['2021-04-02'],
#>   's3://bucket-name/folder/date=2021-04-03/': ['2021-04-03']}}

然后可以在控制台中查看 S3 数据:

在此处输入图像描述

但是使用日期过滤器重新读取会返回 4 条记录:

wr.s3.read_parquet(path = s3_path,
                   partition_filter = lambda x: x["date"] >= "2021-04-02"
)
#>      val
#> 0    1
#> 1    3
#> 2    2
#> 3    5

事实上 sub'inglambda x: False仍然返回 4 行。我错过了什么?这是来自指导

partition_filter (Optional[Callable[[Dict[str, str]], bool]]) – 回调函数过滤器应用于 PARTITION 列(PUSH-DOWN 过滤器)。此函数必须接收单个参数 (Dict[str, str]),其中键是分区名称,值是分区值。分区值将始终是从 S3 中提取的字符串。此函数必须返回一个布尔值,True 读取分区或 False 忽略它。如果 dataset=False,则忽略。例如 lambda x: True if x["year"] == "2020" and x["month"] == "1" else False

我注意到返回的数据框不包括上传数据中的分区“日期”列 - 在文档中看不到对此删除的引用,并且不清楚是否相关。

4

1 回答 1

3

从文档中,Ignored if dataset=False.. dataset=True作为参数添加到您的read_parquet调用中就可以了

于 2021-04-07T08:15:35.430 回答