我正在尝试使用具有 HTTPFS 扩展的 DuckDB 从具有相似密钥的 s3 存储桶中查询大约 1000 个具有相同架构的 parquet 文件。
当我使用 duckdb 查询单个文件时,我能够获取表格
import duckdb
import pandas as pd
cursor = duckdb.connect()
df = cursor.execute(f"""
INSTALL httpfs;
LOAD httpfs;
SET s3_region='{s3_region}';
SET s3_access_key_id='{access_key_id}';
SET s3_secret_access_key='{secret_access_key}';
SELECT *
FROM parquet_scan(['s3:://bucket/folder/fname.parquet'],
FILENAME = 1);
""").df()
但是,当我使用文件通配符时,正如文档(https://duckdb.org/docs/extensions/httpfs)所解释的那样,我得到一个
duckdb.Error: Invalid Error: HTTP GET error
,这是一个HTTP 403(访问被拒绝)。
SELECT *
FROM parquet_scan(['s3:://bucket/folder/*.parquet'],
FILENAME = 1);
我以为这只是一个 AWS IAM 权限问题,但我已经授予了对整个存储桶的列表和读取访问权限,所以据我所知,事实并非如此。
导致此错误的原因是什么?
以下是我们在 CI/CD 中运行的用于测试 S3 通配的测试。我没有发现您的语法有任何问题,所以也许这是某种配置或访问问题?
我遇到了同样的问题。会话令牌对我有用。在查询中设置以下内容,而不是
key_id
和密钥。
SET s3_session_token='{aws_session_token}';