geo*_*ory 2 python amazon-s3 amazon-web-services aws-data-wrangler
partition_filter中的参数未能wr.s3.read_parquet()过滤 S3 上的分区 Parquet 数据集。这是一个可重现的示例(可能需要正确配置的boto3_session参数):
数据集设置:
\nimport 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\']}}\nRun Code Online (Sandbox Code Playgroud)\n然后可以在控制台中查看 S3 数据:
\n\n但使用日期过滤器读回会返回 4 条记录:
\nwr.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\nRun Code Online (Sandbox Code Playgroud)\n事实上 sub\'inglambda x: False仍然返回 4 行。我缺少什么?这是来自指导:
\n\npartition_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| 归档时间: |
|
| 查看次数: |
3934 次 |
| 最近记录: |