python - 将 DuckDB 与 s3 一起使用?

标签 python pandas amazon-s3 duckdb

我正在尝试在 jupyter notebook 中使用 DuckDB 来访问和查询 s3 中保存的一些 Parquet 文件,但似乎无法让它工作。根据过去的经验,我觉得我需要分配适当的文件系统,但我不确定如何/在何处执行此操作。

以下代码引发错误:RuntimeError: IO Error: No files found that match the pattern "s3://<bucket>/<file>.parquet"

import boto3
import duckdb

s3 = boto3.resource('s3')
client=boto3.client("s3")
con = duckdb.connect(database=':memory:', read_only=False)

con.execute("""
SET s3_region='-----';
SET s3_access_key_id='-----';
SET s3_secret_access_key='-----';
""")
out = con.execute(f"select * from parquet_scan('s3://<bucket>/<file>.parquet') limit 10;").fetchall()

我想使用 Pandas read_sql如果可以,请使用此功能,但放置此代码以避免增加问题的复杂性。

我很困惑,因为这段代码有效:

import pandas as pd
import boto3

s3 = boto3.resource('s3')
client=boto3.client("s3")

df = pd.read_parquet("s3://<bucket>/<file>.parquet")

最佳答案

HTTPFS 不包含在包中。但是,您可以从源代码构建它,请参阅下面的代码片段

这假设您在 Linux 机器或容器上安装了 python3/pip3。我使用的是 photon4 容器,在其他 linux 发行版上,包名称可能略有不同。

# install build dependencies
yum install build-essential cmake git openssl-devel python3-devel -y

# install python dependencies
pip3 install setuptools numpy

# clone repo with source code
git clone https://github.com/duckdb/duckdb && cd duckdb

# set a flag to build package with HTTPFS
export BUILD_HTTPFS=1
make

# once duckdb libs are built, do it again enabling python package
export BUILD_PYTHON=1
make

之后,即使不运行 pip install,它也应该可用。 如果你在单独的容器中构建它,你可以复制或替换这个文件: tools/pythonpkg/build/lib.linux-x86_64-3.9/duckdb.cpython-39-x86_64-linux-gnu.so 到目标机器上的 /usr/lib/python3.9/site-packages/

关于python - 将 DuckDB 与 s3 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69801372/

相关文章:

python - 如何 append 到AWS S3上的json文件

python - 如何使用 Python 在 Ubuntu 中创建自己的命令

python - NumPy 一次保存一些数组

python - openai python 似乎只从 openai.Image.create_edit 生成相同的图像

python - 当轴点是 bin 时,如何在 matplotlib 中对轴进行排序?

Python:以另一列为条件的数据框中列表的逐元素平均值

python - 计算一个值在数据框列中出现的频率

java - Amazon S3 在存储桶之间复制对象

javascript - 无法将图像放到 Amazon S3 上

python - 将反引号 (`) + 分数的字符串转换为 float