标签: duckdb

如何在 duckdb 上进行真空处理(减小文件大小)

我正在测试用于分析的 duckdb 数据库,我必须说速度非常快。问题是数据库文件越来越大,但我需要将其缩小以共享它。

在 sqlite 中,我记得使用 VACUUM 命令,但这里相同的命令什么也不做。尺寸是一样的。

如何减少duckdb数据库的文件大小?

duckdb

8
推荐指数
1
解决办法
2214
查看次数

将 DuckDB 与 s3 一起使用?

我试图在 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)

python amazon-s3 pandas duckdb

8
推荐指数
2
解决办法
8058
查看次数

如何限制R中duckdb的内存使用?

我有几个大型 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 工作,因为我认为查询应该更快。任何帮助,将不胜感激!

r rsqlite duckdb

7
推荐指数
1
解决办法
2260
查看次数

在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)

sql duckdb

7
推荐指数
1
解决办法
3692
查看次数

读取 DuckDB 中的分区 parquet 文件

背景

  • 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 查询分区的镶木地板文件?或者这是一个限制/错误?

parquet duckdb

6
推荐指数
1
解决办法
6779
查看次数

在 dbeaver 中设置到 duckdb 的只读连接

我正在 python 中使用 duckdb,并且想在只读模式下使用 dbeaver。我可以在 dbeaver 中的哪个位置更改 duckdb 的配置,它不会出现在与 Postgres 相同的位置?

我尝试过的:

  • 在python关闭连接中创建数据,然后可以通过dbeaver访问duckdb
  • 使用配置在 python 中创建数据,READ_WRITE然后打开 dbeaver 并在访问文件锁定时出现错误

dbeaver duckdb

6
推荐指数
1
解决办法
3624
查看次数

修复 Duckdb Insert 中未实现的 Cast 错误

我正在使用 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)

填充任何空值以避免错误,但我仍然收到相同的错误。如何解决这个问题?

python database duckdb

6
推荐指数
1
解决办法
4443
查看次数

使用 dplyr 语法在 duckdb 中生成确定性随机数

如何将 duckdb 的setseed()函数(请参阅参考文档)与 dplyr 语法一起使用,以确保下面的分析是可重现的?

\n
# 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)

r dplyr apache-arrow duckdb

5
推荐指数
1
解决办法
227
查看次数

如何在 python 会话中获取 duckdb 可见的类表对象列表?

我喜欢 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)及其模式?

谢谢!

python pandas duckdb

3
推荐指数
1
解决办法
1661
查看次数

R:DuckDB DBconnect 非常慢 - 为什么?

我有一个包含柱状数字和字符串(磁盘上 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 所特有的

sqlite r duckdb

1
推荐指数
1
解决办法
853
查看次数

子查询返回 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)

python sql duckdb

1
推荐指数
1
解决办法
354
查看次数

duckdb 的构建轮子失败

通过 pyCharm 终端输入 pip3 install duckdb 后,我收到此消息。

错误:无法为 duckdb 构建轮子,这是安装基于 pyproject.toml 的项目所必需的

我在尝试安装其他软件包(如 pygwalker)时收到相同的消息

我使用 pip3 安装 duckdb 和 pygwalker。

python duckdb

1
推荐指数
1
解决办法
1142
查看次数

使用 Clickhouse 创建 parquet 文件并使用 DuckDB 读取

按照本指南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 中的压缩格式吗?

clickhouse duckdb

0
推荐指数
1
解决办法
361
查看次数

标签 统计

duckdb ×13

python ×5

r ×3

pandas ×2

sql ×2

amazon-s3 ×1

apache-arrow ×1

clickhouse ×1

database ×1

dbeaver ×1

dplyr ×1

parquet ×1

rsqlite ×1

sqlite ×1