如何使用DuckDB从Google存储中读取CSV文件

zmeyuzjn  于 2023-05-26  发布在  Go
关注(0)|答案(1)|浏览(205)

我使用的是duckdb版本0.8.0
我有一个CSV文件位于谷歌存储gs://some_bucket/some_file.csv,并希望使用duckdb加载此。
在pandas中,我可以执行pd.read_csv("gs://some_bucket/some_file.csv"),但在duckdb中似乎不行。我看到这里有一些文档:https://duckdb.org/docs/guides/import/s3_import.html,但我发现这令人困惑,因为它主要针对s3的使用。
我想我得跑了:

duckdb.sql("INSTALL httpfs;")
duckdb.sql("LOAD httpfs;")

从文档中,我不确定参数是什么:

SET s3_access_key_id='key_id';
SET s3_secret_access_key='access_key';

会的。
如何从duckdb中的google存储加载csv?

编辑-未成功的方法

我已经添加了hmac键,并下载他们以下指南在这里:https://cloud.google.com/storage/docs/authentication/managing-hmackeys#gsutil_1

import duckdb
import os

duckdb.sql("LOAD httpfs;")

hmac_access = os.getenv('GOOGLE_HMAC_ACCESS_ID')
hmac_secret = os.getenv('GOOGLE_HMAC_SECRET')

duckdb.sql(f"SET s3_access_key_id='{hmac_access}';")
duckdb.sql(f"SET s3_secret_access_key='{hmac_secret}';")

################################################################################
# approach 1

# Doesn't work - fails with:
# 
# Traceback (most recent call last):
#   File "duck_test.py", line 18, in <module>
#     duckdb.sql("SELECT * FROM '{gcp_path_1}'").show()
# duckdb.CatalogException: Catalog Error: Table with name {gcp_path_1} does not exist!
# Did you mean "pg_am"?

# duckdb.sql(f"SELECT * FROM '{gcp_path_1}'").show()

################################################################################
# approach 2

# Fails with:

# Traceback (most recent call last):
#   File "duck_test.py", line 32, in <module>
#     duckdb.sql(f"SELECT * from read_csv('{gcp_path_1}', AUTO_DETECT=TRUE);")
# duckdb.HTTPException: HTTP Error: HTTP GET error on 'https://some_bucket.s3.amazonaws.com/some_file.csv' (HTTP 400)

duckdb.sql(f"SELECT * from read_csv('{gcp_path_1}', AUTO_DETECT=TRUE);")

编辑(工作中)

在上面的代码中,我忘记设置

duckdb.sql("SET s3_endpoint='storage.googleapis.com'")

在设置此之后,两种方法都从存储器读取。

of1yzvn4

of1yzvn41#

要访问您的文件,您需要使用s3作为URL前缀。
1.如果您的GCS存储桶向公众开放

duckdb.sql('INSTALL httpfs')
duckdb.sql('LOAD httpfs')

duckdb.sql("SELECT * FROM 's3://some_bucket/some_file.csv'").show()

1.如果您的GCS存储桶不是公共的。首先,您需要设置一个HMAC密钥。转到google cloud console并按照说明操作。然后,执行以下命令

duckdb.sql('INSTALL httpfs')
duckdb.sql('LOAD httpfs')
duckdb.sql("SET s3_endpoint='storage.googleapis.com'")

# You will obtain the key_id from the previous step of 
# configuring settings in the Google Console.
duckdb.sql("SET s3_access_key_id='<your-key-id>'") 

# You will obtain the secret_access_key from the previous step of 
# configuring settings in the Google Console.
duckdb.sql("SET s3_secret_access_key='<your-key>'") 

duckdb.sql("SELECT * FROM 's3://some_bucket/some_file.csv'").show()

相关问题