新闻

从 Kdb+ 到 DolphinDB,一文帮你成为数据迁移小能手

2022.11.08

本教程旨在为 Kdb+ 使用者迁移到 DolphinDB 提供一份简明的参考,考察了两者的相同点和区别,介绍了如何将 Kdb+ 数据迁移到 DolphinDB,并总结了从 Kdb+ 到 DolphinDB 编程语法方面的映射。

Kdb+ 与 DolphinDB 的异同

Kdb+诞生于上世纪90年代末,主要用于金融场景的数据处理。DolphinDB 的首次发布在2018,相隔 Kdb+ 20年。
相同点

1)数据库类型

DolphinDB 和 Kdb+ 都是列存储的时间序列数据库,都包括磁盘数据库和内存数据库,同样支持并鼓励对表进行分区。数据库系统都包括了编程语言,非常适合库内开发重度的数据应用。

2)编程语言

DolphinDB 和 Kdb+ 在编程语言方面有许多相似的地方。DolphinDB 同样支持元编程、向量处理和函数式编程,部分 SQL 语句可以在 DolphinDB 脚本中直接使用。Kdb+ 的数据类型、函数和关键字大多能在 DolphinDB 中找到对应,大部分的 Kdb+ 脚本都可以一对一翻译为 DolphinDB 脚本。
3)金融支持

DolphinDB 和 Kdb+ 都对金融领域有非常好的支持。作为列式存储的时序数据库,两者不仅有着常规数据库的精确性、稳定性和安全性,还在存储和处理结构化时间序列数据的场景下有天然的优势,并且都支持对向量、矩阵、表等多种类型的数据进行数值分析的操作,非常适合追求高性能和高灵活性的金融应用领域。此外,DolphinDB 和 Kdb+ 还都具备对海量流数据进行实时分析的能力,是流数据库、内存数据库和历史数据三合一的全栈数据平台。

不同点

1)系统架构

DolphinDB 和 Kdb+ 在架构上有很大的不同。DolphinDB 的构架引入了分布式文件系统,天然具备数据高可用、系统高容错、集群易扩展等分布式系统设计所带来的优势。相比之下,主要基于高性能计算机设计的 Kdb+,虽然也能通过脚本修改路由网关的方式,运行在多服务器集群上,但这种方式具有很大的局限性。除了集群的部署难度和扩展性受限,Kdb+ 很难像 DolphinDB 一样实现自动平衡节点负载来提升并行计算的性能,或是在某个节点故障时保证系统的高可用性。
2)多用户接入支持

DolphinDB 和 Kdb+ 在架构上的另一个不同体现在多用户和多线程的支持上。DolphinDB 支持多用户同时接入系统进行作业,用户可以使用 Web 端管理页面、VS code 插件或是桌面端的 DolphinDB GUI 连接服务器运行脚本。DolphinDB 为每一个接入的用户创建自己的session,相互之间不可见,自定义变量和函数的共享则通过使用 share 关键字以及创建 module 或 function view 的方式来实现。

Kdb+ 虽然支持多核并行计算来完成一个任务,但同一时间内,一个数据库实例只允许一个用户跑一个任务。单任务的设计大大简化了Kdb+的系统实现。但一个运行非常耗时的任务作业就可能导致整个数据库系统的阻塞。因此,Kdb+在设计上并不鼓励多用户共享一个可写的实例,大部分情况下鼓励用户启动自己的实例来完成工作。如果多个用户共享一个实例,Kdb+ 让所有用户共享一个 session,用 namespace来区分不同用户创建的变量或自定义函数,但不强制要求用户创建自己的namespace。

3)数据库特性

DolphinDB 和 Kdb+ 磁盘存储的模式不同。Kdb+ 使用离线存储模式,数据持久化需要频繁读写磁盘,在部分应用场景会因为 IO 的限制而效率较低。DolphinDB 使用在线存储,可以保持数据随时可用的状态。

此外,DolphinDB 数据库还有许多 Kdb+ 没有的特性。DolphinDB 内置了 OLAP 和 TSDB 双引擎,对事务的 ACID 有严格的支持。DolphinDB 提供包括技术分析指标库(TA-lib)、MyTT(My麦语言 T通达信 T同花顺)指标库和 WorldQuant 101 Alpha 因子指标库在内的1000多个内置函数,能更好地支持金融领域的应用场景。针对高频数据的实时分析处理,DolphinDB 内置多种流计算引擎,支持增量计算和并发计算,窗口函数的性能不受限于窗口长度,能很好地满足物联网和金融领域的应用需求。

4)编程友好

DolphinDB 和 Kdb+ 编程语言的设计理念有很大不同。Kdb+ 要求代码尽可能简短,来减小整个程序的footprint,从而换取更少的访存时间。Kdb+ 编程语言对同一操作符做了多种重载,表达式从左到右解析,运算符没有优先级,错误信息也非常简单。而 DolphinDB 的编程语言设计上非常注重代码的可读性,语法更接近 Python,表达式跟大部分编程语言的习惯相同,从右到左解析,并尊重运算符的优先级。DolphinDB 编程语言可读性高,上手难度低,代码更容易更新维护,是比 Kdb+ 更加适合现代软件工程团队协作的编程语言。

5)中文友好

与 Kdb+ 相比,DolphinDB 对中文用户更加友好。DolphinDB 由浙江智臾科技有限公司自主研发,有丰富的中文教程和交流氛围良好的技术交流社区,DolphinDB 团队也在不断地对产品进行更新和维护。

如何从 Kdb+ 导入数据到 DolphinDB

DolphinDB 为导入 Kdb+ 数据提供插件支持,插件代码已开源在 github/gitee 平台,具体使用请参考 github 上的教程或 gitee 上的教程。

DolphinDB 的 Kdb+ 插件为用户提供了两种数据导入方式:(1)连接正在运行的 Kdb+ 数据库,以 Kdb+ 数据库作为中间管道导入数据;(2)直接读取磁盘上的 Kdb+ 数据文件进行导入。两种方式都会将数据加载为 DolphinDB 的内存表。

使用 DolphinDB 的 Kdb+ 插件导入数据,在脚本中用 loadPlugin("/path/to/plugin/PluginKDB.txt") 语句加载插件,就可以用插件提供的函数进行数据导入。对于第一种导入方式,首先需要使用 connect 函数建立与 Kdb+ 数据库的连接,获取连接句柄,之后可以用 close 函数断开连接。使用 loadTable 函数通过 Kdb+ 数据库读取数据,需要提供表文件的路径和 sym 文件路径,sym 文件路径可以为空。

// 加载插件loadPlugin("/home/DolphinDBPlugin/kdb/build/PluginKDB.txt")// 确保插件加载完毕再执行之后的代码go// 连接 kdb+ 数据库,用户名和密码字段可以为空handle = kdb::connect("127.0.0.1", 5000, "admin:123456")// 指定文件路径DATA_DIR="/home/kdb/data/kdb_sample"// 通过 loadTable,加载数据到 DolphinDBDaily = kdb::loadTable(handle, DATA_DIR + "/2022.06.17/Daily/", DATA_DIR + "/sym")Minute = kdb::loadTable(handle, DATA_DIR + "/2022.06.17/Minute", DATA_DIR + "/sym")Ticks = kdb::loadTable(handle, DATA_DIR + "/2022.06.17/Ticks/", DATA_DIR + "/sym")Orders = kdb::loadTable(handle, DATA_DIR + "/2022.06.17/Orders", DATA_DIR + "/sym")// 关闭连接kdb::close(handle)

对于第二种文件导入方式,使用 loadFile 函数直接读取磁盘上的 Kdb+ 文件,需要提供表文件的路径和可选的 sym 文件路径,sym 文件路径可以为空。

// 加载插件loadPlugin("/home/DolphinDBPlugin/kdb/build/PluginKDB.txt")// 确保插件加载完毕再执行之后的代码go// 指定文件路径DATA_DIR="/home/kdb/data/kdb_sample"// 通过 loadFile,加载数据到 DolphinDBDaily2 = kdb::loadFile(DATA_DIR + "/2022.06.17/Daily", DATA_DIR + "/sym")Minute2= kdb::loadFile(DATA_DIR + "/2022.06.17/Minute/", DATA_DIR + "/sym")Ticks2 = kdb::loadFile(DATA_DIR + "/2022.06.17/Ticks/", DATA_DIR + "/sym")Orders2 = kdb::loadFile(DATA_DIR + "/2022.06.17/Orders/", DATA_DIR + "/sym")

给 Kdb+ 使用者的 DolphinDB 语法参考

为了方便广大 Kdb+ 用户随时查阅语法映射,我们基于 Kdb+ 和 q 官方参考文档和 DolphinDB 2.0用户手册编写了一套简易字典,包含了从数据类型、关键字、运算符、副词到执行控制等方面的语法对应:

数据类型

基本数据类型

其他数据类型

数据类型检查函数

关键字

control 类

env 类

interpret 类

join 类

list 类

logic 类

math 类

meta 类

SQL类

sort 类

table 类

text 类

自定义函数

运算符

副词

执行控制

以上 Kdb+ 函数或关键字在 DolphinDB 中的对应,使用方法可能与原函数略有差异,但可保证功能上的可替代性。