digoal
2023-02-14
PostgreSQL , PolarDB , duckdb , 新版本
DuckDB 发布 0.7.0 - 拉布拉多鸭. 每次发布都用一种鸭子, 到底有多少种鸭子? 多达共44属156种? https://baike.baidu.com/item/%E9%B8%AD%E7%A7%91/2343867
https://duckdb.org/2023/02/13/announcing-duckdb-070.html
新版本包含对 JSON 支持的许多改进、新的 SQL 功能、对数据摄取和导出的改进以及其他新功能。以下是最具影响力的更改的摘要,以及实现这些功能的链接 PR。
JSON 摄取。这个版本介绍了read_json和read_json_auto方法。这些可用于将 JSON 文件提取为表格格式。与 类似read_csv,该read_json方法需要指定一个模式,而read_json_auto使用采样自动从文件中推断出 JSON 的模式。支持换行分隔的 JSON 和常规JSON 。
FROM 'data/json/with_list.json';
id | name |
---|---|
1 | [O, Brother,, Where, Art, Thou?] |
2 | [Home, for, the, Holidays] |
3 | [The, Firm] |
4 | [Broadcast, News] |
5 | [Raising, Arizona] |
DuckDB 已经能够摄取配置单元分区的 Parquet 和 CSV 文件已有一段时间了。在此版本之后,DuckDB 也将能够使用该子句写入配置单元分区的数据PARTITION_BY。这些文件可以在本地或远程导出到 S3 兼容存储。这是一个本地示例:
COPY orders TO 'orders' (FORMAT PARQUET, PARTITION_BY (year, month));
这将导致 Parquet 文件写入以下目录结构:
orders
├── year=2021
│ ├── month=1
│ │ ├── file1.parquet
│ │ └── file2.parquet
│ └── month=2
│ └── file3.parquet
└── year=2022
├── month=11
│ ├── file4.parquet
│ └── file5.parquet
└── month=12
└── file6.parquet
借助并行 Parquet 和 CSV 写入器支持,此版本大大加快了Parquet 和 CSV 写入速度。
格式 | 老的 | 新(8T) |
---|---|---|
CSV文件 | 2.6秒 | 0.38秒 |
parquet文件 | 7.5秒 | 1.3秒 |
请注意,目前并行写入目前仅限于保留非插入顺序 - 可以通过将设置设置preserve_insertion_order为 false 来切换。在未来的版本中,我们的目标是减轻这种限制,并排序并行插入顺序保留写入。
此版本增加了对将多个数据库附加到同一个 DuckDB 实例的支持。这很容易允许数据在不同的 DuckDB 数据库文件之间传输,也允许来自不同数据库文件的数据在单独的查询中组合在一起。也可以附加远程 DuckDB 实例(存储在 Github 等网络可访问位置)。
ATTACH 'new_db.db';
CREATE TABLE new_db.tbl(i INTEGER);
INSERT INTO new_db.tbl SELECT * FROM range(1000);
DETACH new_db;
有关详细信息,请参阅文档。
除了添加对附加 DuckDB 数据库的支持外,此版本还添加了对可插入数据库引擎的支持。这允许扩展定义它们自己的数据库和可以附加到系统的目录引擎。一旦附加,引擎就可以支持读取和写入。SQLite扩展利用它向 DuckDB 添加对 SQLite 数据库文件的本地读/写支持。
ATTACH 'sqlite_file.db' AS sqlite (TYPE SQLITE);
CREATE TABLE sqlite.tbl(i INTEGER);
INSERT INTO sqlite.tbl VALUES (1), (2), (3);
SELECT * FROM sqlite.tbl;
使用它,可以附加、查询和修改 SQLite 数据库文件,就好像它们是本机 DuckDB 数据库文件一样。这允许数据在 SQLite 和 DuckDB 之间快速传输 - 并允许您使用 DuckDB 丰富的 SQL 方言来查询存储在 SQLite 表中的数据。
此版本使用子句以及兼容的/语法添加了Upsert 支持。ON CONFLICT SQLite INSERT OR REPLACE INSERT OR IGNORE
CREATE TABLE movies(id INTEGER PRIMARY KEY, name VARCHAR);
INSERT INTO movies VALUES (1, 'A New Hope');
FROM movies;
INSERT OR REPLACE INTO movies VALUES (1, 'The Phantom Menace');
FROM movies;
此版本中添加了对横向连接的支持。横向连接是相关子查询的一种更灵活的变体,可以更轻松地处理嵌套数据,因为它们可以更轻松地取消嵌套数据的嵌套。
虽然 SQL 在形式上对无序集建模,但实际上数据集的顺序通常是有意义的。DuckDB 提供了在将数据加载到表中或将数据导出回文件时维护行顺序的保证——以及在执行查询(例如LIMIT没有相应ORDER BY子句)时。
为了改进对此用例的支持 - 此版本引入了POSITIONAL JOIN. 这种新的连接类型不是连接行的值,而是根据它们在表中的位置连接行。
CREATE TABLE t1 AS FROM (VALUES (1), (2), (3)) t(i);
CREATE TABLE t2 AS FROM (VALUES (4), (5), (6)) t(k);
SELECT * FROM t1 POSITIONAL JOIN t2;
i | k |
---|---|
1 | 4 |
2 | 5 |
3 | 6 |
此版本增加了对fsspec 文件系统 API 的支持。fsspec允许用户定义他们可以传递给 DuckDB 的自己的文件系统。然后 DuckDB 将使用这个文件系统来读写数据。这可以支持 DuckDB 本身可能不支持的存储后端,例如 FTP。
import duckdb
from fsspec import filesystem
duckdb.register_filesystem(filesystem('gcs'))
data = duckdb.query("select * from read_csv_auto('gcs:///bucket/file.csv')").fetchall()
增量压缩。使用新的delta 和 delta-constant 压缩改进了存储中数值的压缩。当压缩等间距的值时,这种压缩方法特别有效。例如,数字序列 ( 1, 2, 3, ...) 或它们之间具有固定间隔的时间戳 ( 12:00:01, 12:00:02, 12:00:03, ...
)。