Eth*_*han 8 python amazon-s3 pandas duckdb
我试图在 jupyter 笔记本中使用 DuckDB 来访问和查询 s3 中保存的一些镶木地板文件,但似乎无法让它工作。根据过去的经验,我觉得我需要分配适当的文件系统,但我不确定如何/在哪里执行此操作。
下面的代码会引发错误: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()
Run Code Online (Sandbox Code Playgroud)
如果可以的话,我想使用 pandasread_sql功能,但放置此代码以避免增加问题的复杂性。
我很困惑,因为这段代码有效:
import pandas as pd
import boto3
s3 = boto3.resource('s3')
client=boto3.client("s3")
df = pd.read_parquet("s3://<bucket>/<file>.parquet")
Run Code Online (Sandbox Code Playgroud)
小智 8
改为执行此操作
con.execute("""
INSTALL httpfs;
LOAD httpfs;
SET s3_region='-----';
SET s3_access_key_id='-----';
SET s3_secret_access_key='-----';
""")
Run Code Online (Sandbox Code Playgroud)
软件包中不包含 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
Run Code Online (Sandbox Code Playgroud)
之后,即使不运行 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/ on your target machine