我正在测试用于分析的 duckdb 数据库,我必须说速度非常快。问题是数据库文件越来越大,但我需要将其缩小以共享它。
在 sqlite 中,我记得使用 VACUUM 命令,但这里相同的命令什么也不做。尺寸是一样的。
如何减少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) 我有几个大型 R data.frames,我想将它们放入本地 duckdb 数据库中。我遇到的问题是 duckdb 似乎将所有内容加载到内存中,即使我指定一个文件作为位置。
另外,我不清楚建立连接的正确方法(所以我不确定这是否与此有关)。我努力了:
duckdrv <- duckdb(dbdir="dt.db", read_only=FALSE)
dkCon <- dbConnect(drv=duckdrv)
Run Code Online (Sandbox Code Playgroud)
并且:
duckdrv <- duckdb()
dkCon <- dbConnect(drv=duckdrv, dbdir="dt.db", read_only=FALSE)
Run Code Online (Sandbox Code Playgroud)
两者都工作正常,这意味着我可以创建表、使用 dbWriteTable、运行查询等。但是,内存使用量非常高(与 data.frames 的大小大约相同)。我想我在某处读到,duckdb 默认使用一定百分比的可用内存,这对我来说不起作用,因为我使用的系统是共享资源。我还想并行运行一些查询,这将导致内存使用量更高。
我已经尝试过这个:
dbExecute(dkCon, "PRAGMA memory_limit='1GB';")
Run Code Online (Sandbox Code Playgroud)
但这似乎没有什么区别,即使我关闭连接,关闭实例并重新连接。
有谁知道我该如何解决这个问题?当我将数据写入表时,RSQLite 也暂时具有较高的内存使用率,但随后它会恢复正常,如果我打开只读连接,则根本不是问题。我想让 duckdb 工作,因为我认为查询应该更快。任何帮助,将不胜感激!
许多数据库引擎支持自动递增主键,我想在我的新 DuckDB 方法中使用这种方法,但我不知道如何设置它。例如,在 MySQL 中:
CREATE TABLE Persons (
Personid int NOT NULL AUTO_INCREMENT,
LastName varchar(255) NOT NULL,
FirstName varchar(255),
Age int,
PRIMARY KEY (Personid)
);
Run Code Online (Sandbox Code Playgroud) 背景:
DuckDB 允许直接查询 parquet 文件。例如 con.execute("从 'Hierarchy.parquet' 中选择 *)
Parquet 允许按列值对文件进行分区。对 parquet 文件进行分区时,将使用 parquet 文件的名称和列值的子文件夹创建顶级文件夹,然后这些子文件夹包含实际的 parquet 数据文件。例如 Hierarchy.parquet(文件夹)--> date=20220401(子文件夹)-->part1.parquet
预期行为
DuckDB 用于查询分区和未分区的 parquet 文件。
观察到的行为
DuckDB 在查询分区的 parquet 文件时失败,但可以处理未分区的 parquet 文件。
con.execute("Select * from 'Hierarchy.parquet'")RuntimeError: IO Error: No files found that match the pattern "Hierarchy.parquet"当 Hierarchy.parquet 分区时失败
。
查询底层个人数据文件工作正常:
con.execute("Select * from 'Hierarchy.parquet/date=20220401/part1.parquet'")
有没有办法使用 DuckDB 查询分区的镶木地板文件?或者这是一个限制/错误?
我正在 python 中使用 duckdb,并且想在只读模式下使用 dbeaver。我可以在 dbeaver 中的哪个位置更改 duckdb 的配置,它不会出现在与 Postgres 相同的位置?
我尝试过的:
READ_WRITE然后打开 dbeaver 并在访问文件锁定时出现错误我正在使用 Duckdb 通过批量插入插入数据
使用以下代码时
conn.execute('INSERT INTO Main SELECT * FROM df')
Run Code Online (Sandbox Code Playgroud)
我收到以下错误
Invalid Input Error: Failed to cast value: Unimplemented type for cast (VARCHAR -> NULL)
Run Code Online (Sandbox Code Playgroud)
我尝试使用
df.fillna('N/A')
Run Code Online (Sandbox Code Playgroud)
填充任何空值以避免错误,但我仍然收到相同的错误。如何解决这个问题?
如何将 duckdb 的setseed()函数(请参阅参考文档)与 dplyr 语法一起使用,以确保下面的分析是可重现的?
# dplyr version 1.1.1\n# arrow version 11.0.0.3\n# duckdb 0.7.1.1\nout_dir <- tempfile()\narrow::write_dataset(mtcars, out_dir, partitioning = "cyl")\n\nmtcars_ds <- arrow::open_dataset(out_dir)\n\nmtcars_smry <- mtcars_ds |>\n arrow::to_duckdb() |>\n dplyr::mutate(\n fold = ceiling(3 * random())\n ) |>\n dplyr::summarize(\n avg_hp = mean(hp),\n .by = c(cyl, fold)\n )\n\nmtcars_smry |>\n dplyr::collect()\n#> Warning: Missing values are always removed in SQL aggregation functions.\n#> Use `na.rm = TRUE` to silence this warning\n#> This warning is displayed once every 8 hours.\n#> # A tibble: …Run Code Online (Sandbox Code Playgroud) 我喜欢 duckdb 让我像查询 SQL 表一样查询 DataFrame:
df = pandas.read_parquet("my_data.parquet")
con.query("select * from df limit 10").fetch_df()
Run Code Online (Sandbox Code Playgroud)
我也喜欢 duckdb 拥有像SHOW TABLES;真正的数据库一样的元数据命令。但是,SHOW TABLES;不显示 pandas DataFrames 或其他类似表格的对象。
我的问题是:duckdb 是否提供类似的东西SHOW TABLES;,包括(1)真实的数据库表和(2)类表对象(例如 pandas DataFrames)及其模式?
谢谢!
我有一个包含柱状数字和字符串(磁盘上 13GB)的 *.csv 文件,我将其导入到新的 duckdb(或 sqlite)数据库中并将其保存,以便稍后可以在 R 中访问它。但是重新连接会重复它并且非常慢,这是错误的吗?
在 R 内部,我正在执行以下操作:
library(duckdb)
library(dplyr)
library(DBI)
#Create the DB
con <- dbConnect(duckdb::duckdb(), "FINAL_data.duckdb")
#Read in the csv
duckdb_read_csv(con, "data", "FINAL_data_new.csv")
Run Code Online (Sandbox Code Playgroud)
然后我关闭 R 并重新启动它以查看它是否有效:
#这非常慢(大约10分钟),因为它看起来像是在某个地方再次写入数据库。但为什么?
con <- dbConnect(duckdb::duckdb(), "FINAL_data.duckdb")
Run Code Online (Sandbox Code Playgroud)
注意。我添加了 sqlite 作为标签,因为我认为这不是 duckdb 所特有的
我想分组first_name并为每个fist_name得到最低的age。
我在在线sql编译器中运行的查询工作正常,但是当我尝试在python中使用duckDB时,我收到错误,我尝试返回多个列,但这正是我想要的:
duckdb.BinderException: Binder Error: Subquery returns 2 columns - expected 1
LINE 4: WHERE (first_name, age) IN (
Run Code Online (Sandbox Code Playgroud)
我的数据:
customer_id first_name last_name age country
1 John Doe 31 USA
2 Robert Luna 22 USA
3 David Robinson 22 UK
4 John Reinhardt 25 UK
5 Betty Doe 28 UAE
Run Code Online (Sandbox Code Playgroud)
sql查询在在线编译器中运行:
SELECT *
FROM customer
WHERE (first_name, age) IN (
SELECT first_name, min(age)
FROM customer
GROUP BY first_name
)
Run Code Online (Sandbox Code Playgroud)
python 脚本以错误结束
import pandas as …Run Code Online (Sandbox Code Playgroud) 通过 pyCharm 终端输入 pip3 install duckdb 后,我收到此消息。
错误:无法为 duckdb 构建轮子,这是安装基于 pyproject.toml 的项目所必需的
我在尝试安装其他软件包(如 pygwalker)时收到相同的消息
我使用 pip3 安装 duckdb 和 pygwalker。
按照本指南https://clickhouse.com/docs/knowledgebase/mysql-to-parquet-csv-json我已从 MySQL 服务器将一些表导出到镶木地板。
但我无法使用 DuckDB 读取这些镶木地板文件。
我可以检查结构:
DESCRIBE SELECT * FROM 'mytable.parquet';
Run Code Online (Sandbox Code Playgroud)
但如果我尝试阅读:
select ID from mytable.parquet;
Error: Invalid Error: Unsupported compression codec "7". Supported options are uncompressed, gzip, snappy or zstd
Run Code Online (Sandbox Code Playgroud)
我猜想 clickhouse 正在编写 LZ4 压缩的 parquet 文件,而 duckdb 不支持它们。我可以更改 clickhouse-local 中的压缩格式吗?