awswrangler.s3.read_parquet 忽略partition_filter参数

geo*_*ory 2 python amazon-s3 amazon-web-services aws-data-wrangler

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

\n

数据集设置:

\n
import pandas as pd\nimport awswrangler as wr\nimport boto3\n\ns3_path = "s3://bucket-name/folder"\n\ndf = pd.DataFrame({"val": [1,3,2,5], "date": [\'2021-04-01\',\'2021-04-01\',\'2021-04-02\',\'2021-04-03\']})\n\nwr.s3.to_parquet(\n    df = df,\n    path = s3_path,\n    dataset = True,\n    partition_cols = [\'date\']\n)\n#> {\'paths\': [\'s3://bucket-name/folder/date=2021-04-01/38399541e6fe4fa7866181479dd28e8e.snappy.parquet\',\n#>   \'s3://bucket-name/folder/date=2021-04-02/0a556212b5f941c7aa3c3775d2387419.snappy.parquet\',\n#>   \'s3://bucket-name/folder/date=2021-04-03/cb71397bea104787a50a90b078d564bd.snappy.parquet\'],\n#>  \'partitions_values\': {\'s3://aardvark-gdelt/headlines/date=2021-04-01/\': [\'2021-04-01\'],\n#>   \'s3://bucket-name/folder/date=2021-04-02/\': [\'2021-04-02\'],\n#>   \'s3://bucket-name/folder/date=2021-04-03/\': [\'2021-04-03\']}}\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n

在此输入图像描述

\n

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

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

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

\n
\n

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

\n
\n

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

\n

小智 6

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