【问题标题】:DuckDB for reading multiple parquet files on s3DuckDB 用于在 s3 上读取多个镶木地板文件
【发布时间】:2022-10-25 00:50:48
【问题描述】:

我正在尝试使用带有 HTTPFS 扩展的 DuckDB 从具有相似键的 s3 存储桶中查询大约 1000 个具有相同架构的镶木地板文件。

当我用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 权限问题,但我已经授予了对整个存储桶的列表和读取权限,据我所知,事实并非如此。

是什么导致了这个错误?

【问题讨论】:

  • 一件奇怪的事情是我使用 boto3 来列出具有与查询相同的访问键的对象,并且我能够获取数据。我想一个快速的hack就是使用boto3列表对象的输出并将s3 uri连接到duckDB查询中传递给parquet_scan。不理想,但可行。
  • 你有没有尝试过类似SELECT * FROM parquet_scan('s3://bucket/folder/*.parquet', FILENAME = 1);
  • 如果你的意思是没有括号,是的。恐怕不行。也许 parquet_scan 仅 read_parquet 不支持全局匹配?

标签: amazon-s3 parquet duckdb


【解决方案1】:

以下是我们在 CI/CD 中运行以测试 S3 通配的测试。我没有看到您的语法有任何问题,所以可能是某种配置或访问问题?

https://github.com/duckdb/duckdb/blob/4a24d71edecc7c0018eb3860d2e104cfe90462b6/test/sql/copy/parquet/parquet_glob_s3.test

【讨论】:

    猜你喜欢
    • 2017-01-22
    • 2019-12-07
    • 2021-12-28
    • 1970-01-01
    • 2021-01-12
    • 2018-08-13
    • 2019-08-04
    • 2022-06-16
    • 2019-09-23
    相关资源
    最近更新 更多