顾乔芝士网

持续更新的前后端开发技术栈

DuckDB技巧1(Tricks – Part 1)(DuckDB技巧1(Tricks – Part 11)

我们使用一个简单的数据集来展示在使用 DuckDB 时一些实用的小技巧。

接下来的内容,我们介绍了五个在交互式使用场景中非常有用的 DuckDB 操作。操作及其示例如下表所示:

操作

示例代码

漂亮地打印浮点数

SELECT (10 / 9)::DECIMAL(15, 3)

复制表结构(不含数据)

CREATE TABLE tbl AS FROM example LIMIT 0

打乱数据顺序

FROM example ORDER BY hash(rowid + 42)

读取 CSV 时指定字段类型

FROM read_csv('example.csv', types = {'x': 'DECIMAL(15, 3)'})

就地更新 CSV 文件

COPY (SELECT s FROM 'example.csv') TO 'example.csv'

这些小技巧可以帮助你更高效地使用 DuckDB。

创建示例数据集

我们首先创建一个将在本文其余部分中使用的数据集。为此,我们定义一个表,插入一些数据,并将其导出为一个 CSV 文件。

DuckDB 支持多种 SQL 简写,比如 “友好 SQL” 语法。这里我们用 VALUES 搭配 FROM-first 语法,省略了 SELECT 和表结构定义。数据创建脚本能压缩到原来约 60% 的长度,只需一条命令就能生成 CSV:

浮点数的美化打印

在输出浮点数时,小数部分往往难以阅读和比较。例如,下面的查询返回了三个介于 1 到 8 之间的数字,但由于小数部分不同,它们的打印宽度差异很大。

通过将列强制转换为小数点后位数固定的 DECIMAL 类型,一个常见的替代方案是使用 printfformat 函数。

不过,这些方法需要指定格式化字符串,容易遗忘。更糟的是,上述方法返回的是字符串值,这会给后续操作(如排序)带来不便。因此,除非对浮点数的完整精度有严格要求,否则大多数情况下建议使用转换为 DECIMAL 类型来实现美化打印。

复制表的结构

要复制一个表的结构而不复制数据,可以使用 LIMIT 0

打乱数据顺序

有时我们需要通过打乱数据顺序来增加随机性。要实现非确定性的打乱,可以使用 random() 函数对数据进行排序:

确定性打乱数据稍微复杂一些。实现方法是根据伪列 rowid 的哈希值进行排序。注意,rowid 只在物理表中可用,因此需要先将 CSV 加载到表中,然后再执行打乱操作,示例如下:

需要注意的是,+ 42 的作用是将第一行的位置稍作偏移——因为 hash(0) 返回 0(最小值),如果不加偏移,排序时第一行会保持原位。

在 CSV 加载器中指定字段类型

DuckDB 的 CSV 加载器会自动从以下几种类型中检测字段类型:BOOLEAN、BIGINT、DOUBLE、TIME、DATE、TIMESTAMP 和 VARCHAR。

有时,我们希望覆盖自动检测的类型,指定列表外的类型。例如,想让列 x 从一开始就被识别为 DECIMAL 类型。可以通过 read_csv 函数的 types 参数按列指定类型,示例如下:

就地更新 CSV 文件

在 DuckDB 中,可以实现对 CSV 文件的读取、处理和就地写入。例如,要将列 s 重新写入同一个文件,可以直接执行以下命令:

本文介绍了五个实用的 DuckDB 操作技巧,包括浮点数美化打印、复制表结构、数据打乱、CSV 类型指定及就地更新文件。这些技巧不仅简化了数据处理流程,还提升了交互式使用的效率。掌握这些方法,有助于更灵活、高效地利用 DuckDB,推动数据分析和处理工作更加顺畅。更多实用技巧,敬请期待下一篇分享!

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言