利用DuckDB vortex插件读写vortex格式文件

以下是DeepSeek对vortex格式文件的介绍,基本上来自参考文献1,它也是翻译的vortex存储库介绍。

Vortex是一种新兴的列式存储格式,它专为处理大规模数据而设计,旨在成为Apache Parquet等传统列式格式的高性能替代方案。

下面这个表格整理了Vortex的核心用途与特点,方便你快速了解:

主要用途方向实现方式与特点
高性能数据读取通过优化的列式存储和先进编码,实现极速数据扫描(比Parquet快2-10倍)和随机访问(比Parquet快100-200倍)。
高效数据存储与管理采用可扩展编码(如FastLanes、ALP、FSST)和级联压缩技术,在保持高压缩比的同时,减少存储空间占用。
无缝融入现有数据生态设计上与Apache Arrow兼容,支持零拷贝数据转换,并提供了适用于进程间通信和文件存储的零拷贝序列化功能。
支持高级数据操作内置基本计算核心,支持在编码数据上直接进行操作(如过滤下推),并携带延迟计算的统计信息,以优化查询性能。

🔮 应用场景与技术展望

基于其设计目标,Vortex非常适用于对性能有高要求的数据处理场景:

  • 大数据分析与处理:其高效的扫描和随机访问能力,非常适合处理需要频繁访问和分析大规模数据集的场景。
  • 列式数据存储与检索:对于需要高效存储和按列检索数据的应用,Vortex提供了优异的性能。
  • 分布式计算与数据传输:其零拷贝序列化特性使网络传输更为高效,适用于分布式计算环境。
  • 未来技术演进:Vortex的未来版本计划支持GPU上的在设备解压缩,这将为机器学习、科学计算等需要高计算性能的场景提供显著的加速潜力。

💎 总结

总而言之,Vortex的用途可以概括为:致力于解决传统列式存储格式在大数据量下,尤其是需要频繁进行随机访问和复杂扫描查询时遇到的性能瓶颈。它通过一系列前沿的技术创新,在保持高压缩率的同时,极大地提升了数据处理的效率,是数据处理领域一个值得关注的新兴项目。

无意在DuckDB社区版插件列表中看到vortex 插件,试用一下:

在windows_amd64环境安装失败,它没有相应的版本。

install vortex FROM community;
HTTP Error:
Failed to download extension "vortex" at URL "http://community-extensions.duckdb.org/v1.4.1/windows_amd64/vortex.duckdb_extension.gz" (HTTP 404)

切换到Linux,可以安装了,将parquet文件转换成vortex,可以看到两者大小基本一致。两者支持的数据类型也一致。

root@6ae32a5ffcde:/par# ./duckdb141
DuckDB v1.4.1 (Andium) b390a7c376
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
D install vortex FROM community;
100% ▕██████████████████████████████████████▏ (00:00:12.11 elapsed)

D load vortex;
D copy (from 'lineitem_sf01.parquet') to 'lineitem_sf01.vortex' (FORMAT vortex);
D .system ls -l lineitem_sf01.parquet lineitem_sf01.vortex
-rwxrwxrwx 1 root root 19685665 Oct 20 12:43 lineitem_sf01.parquet
-rwxrwxrwx 1 root root 18078492 Nov  8 11:48 lineitem_sf01.vortex
D describe FROM read_vortex('lineitem_sf01.vortex');
┌─────────────────┬───────────────┬─────────┬─────────┬─────────┬─────────┐
│   column_name   │  column_type  │  nullkeydefault │  extra  │
│     varcharvarcharvarcharvarcharvarcharvarchar │
├─────────────────┼───────────────┼─────────┼─────────┼─────────┼─────────┤
│ l_orderkey      │ BIGINT        │ YES     │ NULLNULLNULL    │
│ l_partkey       │ BIGINT        │ YES     │ NULLNULLNULL    │
│ l_suppkey       │ BIGINT        │ YES     │ NULLNULLNULL    │
│ l_linenumber    │ BIGINT        │ YES     │ NULLNULLNULL    │
│ l_quantity      │ DECIMAL(15,2) │ YES     │ NULLNULLNULL    │
│ l_extendedprice │ DECIMAL(15,2) │ YES     │ NULLNULLNULL    │
│ l_discount      │ DECIMAL(15,2) │ YES     │ NULLNULLNULL    │
│ l_tax           │ DECIMAL(15,2) │ YES     │ NULLNULLNULL    │
│ l_returnflag    │ VARCHAR       │ YES     │ NULLNULLNULL    │
│ l_linestatus    │ VARCHAR       │ YES     │ NULLNULLNULL    │
│ l_shipdate      │ DATE          │ YES     │ NULLNULLNULL    │
│ l_commitdate    │ DATE          │ YES     │ NULLNULLNULL    │
│ l_receiptdate   │ DATE          │ YES     │ NULLNULLNULL    │
│ l_shipinstruct  │ VARCHAR       │ YES     │ NULLNULLNULL    │
│ l_shipmode      │ VARCHAR       │ YES     │ NULLNULLNULL    │
│ l_comment       │ VARCHAR       │ YES     │ NULLNULLNULL    │
├─────────────────┴───────────────┴─────────┴─────────┴─────────┴─────────┤
│ 16 rows                                                       6 columns │
└─────────────────────────────────────────────────────────────────────────┘
D describe FROM 'lineitem_sf01.parquet';
┌─────────────────┬───────────────┬─────────┬─────────┬─────────┬─────────┐
│   column_name   │  column_type  │  nullkeydefault │  extra  │
│     varcharvarcharvarcharvarcharvarcharvarchar │
├─────────────────┼───────────────┼─────────┼─────────┼─────────┼─────────┤
│ l_orderkey      │ BIGINT        │ YES     │ NULLNULLNULL    │
│ l_partkey       │ BIGINT        │ YES     │ NULLNULLNULL    │
│ l_suppkey       │ BIGINT        │ YES     │ NULLNULLNULL    │
│ l_linenumber    │ BIGINT        │ YES     │ NULLNULLNULL    │
│ l_quantity      │ DECIMAL(15,2) │ YES     │ NULLNULLNULL    │
│ l_extendedprice │ DECIMAL(15,2) │ YES     │ NULLNULLNULL    │
│ l_discount      │ DECIMAL(15,2) │ YES     │ NULLNULLNULL    │
│ l_tax           │ DECIMAL(15,2) │ YES     │ NULLNULLNULL    │
│ l_returnflag    │ VARCHAR       │ YES     │ NULLNULLNULL    │
│ l_linestatus    │ VARCHAR       │ YES     │ NULLNULLNULL    │
│ l_shipdate      │ DATE          │ YES     │ NULLNULLNULL    │
│ l_commitdate    │ DATE          │ YES     │ NULLNULLNULL    │
│ l_receiptdate   │ DATE          │ YES     │ NULLNULLNULL    │
│ l_shipinstruct  │ VARCHAR       │ YES     │ NULLNULLNULL    │
│ l_shipmode      │ VARCHAR       │ YES     │ NULLNULLNULL    │
│ l_comment       │ VARCHAR       │ YES     │ NULLNULLNULL    │
├─────────────────┴───────────────┴─────────┴─────────┴─────────┴─────────┤
│ 16 rows                                                       6 columns │
└─────────────────────────────────────────────────────────────────────────┘

再比较读取性能。vortex没有实现从文件名后缀直接调用插件,必须明确写read_vortex函数,与parquet的读取速度基本一致,比DuckDB内存表略慢。并没有介绍说的那么厉害,也可能是插件优化不够,没能充分利用它的优势。

D create table lineitem as from 'lineitem_sf01.vortex';
Binder Error:
No extension found that is capable of reading the file "lineitem_sf01.vortex"
* If this file is a supported file format you can explicitly use the reader functions, such as read_csv, read_json or read_parquet

D create table lineitem as from read_vortex('lineitem_sf01.vortex');

D .timer on
D select l_shipmode,sum(l_quantity*l_extendedprice+l_tax)s from lineitem group by l_shipmode;
┌────────────┬───────────────────┐
│ l_shipmode │         s         │
│  varchardecimal(38,4)   │
├────────────┼───────────────────┤
│ RAIL       │ 103710959195.4800 │
│ MAIL       │ 103950423602.2100 │
│ FOB        │ 103621363767.6000 │
│ SHIP       │ 104643625434.0700 │
│ AIR        │ 103914391169.9400 │
│ TRUCK      │ 104286118296.7900 │
│ REG AIR    │ 103750269155.0900 │
└────────────┴───────────────────┘
Run Time (s): real 0.004 user 0.018732 sys 0.001306
D select l_shipmode,sum(l_quantity*l_extendedprice+l_tax)s from read_vortex('lineitem_sf01.vortex') group by l_shipmode;

┌────────────┬───────────────────┐
│ l_shipmode │         s         │
│  varchardecimal(38,4)   │
├────────────┼───────────────────┤
│ TRUCK      │ 104286118296.7900 │
│ REG AIR    │ 103750269155.0900 │
│ RAIL       │ 103710959195.4800 │
│ AIR        │ 103914391169.9400 │
│ MAIL       │ 103950423602.2100 │
│ SHIP       │ 104643625434.0700 │
│ FOB        │ 103621363767.6000 │
└────────────┴───────────────────┘
Run Time (s): real 0.042 user 0.036296 sys 0.019497

D select l_shipmode,sum(l_quantity*l_extendedprice+l_tax)s from 'lineitem_sf01.parquet' group by l_shipmode;
┌────────────┬───────────────────┐
│ l_shipmode │         s         │
│  varchardecimal(38,4)   │
├────────────┼───────────────────┤
│ REG AIR    │ 103750269155.0900 │
│ FOB        │ 103621363767.6000 │
│ AIR        │ 103914391169.9400 │
│ RAIL       │ 103710959195.4800 │
│ MAIL       │ 103950423602.2100 │
│ TRUCK      │ 104286118296.7900 │
│ SHIP       │ 104643625434.0700 │
└────────────┴───────────────────┘
Run Time (s): real 0.024 user 0.038907 sys 0.000000
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值