从 Kdb+ 到 DolphinDB

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从 Kdb+ 到 DolphinDB相关的知识,希望对你有一定的参考价值。

一直以来,Kdb+ 以程序体积小、代码简洁、运行速度快而闻名。它是美国华尔街各大金融机构20多年来处理大规模时序数据的首选系统,通常用于高频交易,非常适用于高速存储、分析、处理和检索时序数据集。Kdb+ 还提供了专门的编程语言 q 语言,简洁而且灵活,天生具有处理大规模时序数据的能力。

2018年初发布的 DolphinDB,同样是性能极佳的时间序列数据库。作为一款国产的高性能分布式数据库产品,DolphinDB 迅速崛起,成为国内头部券商、私募公募的首选方案。DolphinDB 功能强大的编程语言和高容量高速度的流数据分析系统,能在满足低延时高吞吐量数据读写的要求的同时,轻松实现因子挖掘、流式计算、股票行情回放、实时计算高频因子等功能,为金融和物联网领域的数据存储和分析计算提供一站式解决方案。近几年来,DolphinDB 天然的分布式构架,强大的流式增量计算能力,丰富的函数库,以及易用性等优势吸引了大量海内外用户使用 DolphinDB 代替 Kdb+。

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

1. Kdb+ vs DolphinDB

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

1.1 DolphinDB 与 Kdb+ 的相同点

1)数据库类型

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

2)编程语言

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

3)金融支持

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

 

1.2 DolphinDB 与 Kdb+ 的区别

1)系统架构

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

2)多用户接入支持

造成问题。

同时,Kdb+ 对多用户接入的设计是让所有用户共享一个 session,用 domain 来区分不同用户创建的变量或自定义函数,但不强制要求用户创建自己的namespace。而 DolphhinDB 为每一个用户创建自己的session,相互之间不可见,自定义变量和函数的共享则通过使用 share 关键字以及创建 module 或 functionView 的方式实现。相对而言,Kdb+ 的用户 session 管理机制对用户自己操作规范的要求更高。

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 团队也在不断地对产品进行更新和维护。

 

2. 从 Kdb+ 导入数据到 DolphinDB

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

DolphinDB 的 Kdb+ 插件为用户提供了两种数据导入方式:连接正在运行的 Kdb+ 数据库,以 Kdb+ 数据库作为中间管道导入数据;直接读取磁盘上的 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,加载数据到 DolphinDB
Daily = 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,加载数据到 DolphinDB
Daily2 = 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")

 

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

本节的编写基于 ​​Kdb+ 和 q 官方参考文档​​和 ​​DolphinDB 2.0用户手册​​。

本节所提及的 Kdb+ 函数或关键字在 DolphinDB 中的对应,仅保证功能上的可替代性,使用方法可能与原函数略有差异。建议在实际使用前查阅 ​​DolphinDB 2.0用户手册​​。

 

3.1 数据类型

3.1.1 基本数据类型

Kdb+ 数据类型

DolphinDB 数据类型

举例

字节数

范围

 

VOID

NULL

Void

 

boolean

BOOL

1b, 0b, true, false

1

0~1

byte

 

 

 

 

char

CHAR

a, 97c

1

-2 7 +1~2 7 -1

short

SHORT

122h

2

-2 15 +1~2 15 -1

int

INT

21

4

-2 31 +1~2 31 -1

long

LONG

22, 22l

8

-2 63 +1~2 63 -1

real

FLOAT

2.1f

4

有效位数:06~09 位

float

DOUBLE

2.1

8

有效位数:15~17 位

date

DATE

2013.06.13

4

 

month

MONTH

2012.06M

4

 

time

TIME

13:30:10.008

4

 

minute

MINUTE

13:30m

4

 

second

SECOND

13:30:10

4

 

(datetime)

 

 

DATETIME

2012.06.13 13:30:10 or 2012.06.13T13:30:10

4

 

TIMESTAMP

2012.06.13 13:30:10.008 or 2012.06.13T13:30:10.008

8

 

 

DATEHOUR

2012.06.13T13

4

 

timespan

NANOTIME

13:30:10.008007006

8

 

timestamp

NANOTIMESTAMP

2012.06.13 13:30:10.008007006 or 2012.06.13T13:30:10.008007006

8

 

symbol

SYMBOL

 

4

 

STRING

"Hello" or Hello or `Hello

 

 

guid

UUID

5d212a78-cc48-e3b1-4235-b4d91473ee87

16

 

  • DolphinDB 目前没有可以直接对应 Kdb+ 中 byte 的数据类型。
  • Kdb+ 中的 char 类型使用双引号标识,而 DolphinDB 的 CHAR 使用单引号。"c" 在 DolphinDB 中会被识别为字符串。
  • Kdb+ 中的 long 类型与 DolphinDB 的 LONG 数据类型符号不同。一个值为42的长型整数若表示为 42j,则无法被 DolphinDB 识别。
  • Kdb+ 中的 month 类型与 DolphinDB 的 MONTH 数据类型符号不同,2006.07m 在 DolphinDB 中会报错。对于时间类型的值,DolphinDB 用小写字母 m 作分钟类型的后缀,而月份类型的后缀使用了大写字母 M。
  • DolphinDB 中 DATETIME 类型大小为4字节,而 Kdb+ 中 datetime 类型大小为8字节。
  • DolphinDB 的 SYMBOL 类型是特殊的字符串类型,相当于枚举类型,数据在 DolphinDB 系统内部存储为一个整数,因此数据排序和比较更有效率。具体使用请参照《DolphinDB 2.0用户手册》中“数据类型”一节。

 

关于 NULL 和 INF

与 Kdb+ 不同,DolphinDB 没有专门用于表示各个类型正负无穷值的字面量,类型数据溢出时,会被处理为该类型的 NULL 值。通常,在赋值语句或表达式中使用无返回值的函数时,也会得到一个 VOID 类型的 NULL。

通过函数 ​​isVoid​​ 判断是否为 VOID 类型的 NULL,通过函数 ​​isNull​​ 和 ​​isValid​​ 可以检查所有 NULL 值,包括 VOID 和有类型的 NULL。对于不关心 NULL 类型的用户,建议使用 ​​isNull​​ 或 ​​isValid​​ 进行条件判断。

对于 NULL 值的初始化、运算,以及在普通向量函数、聚合函数和高阶函数中的使用方法,《​​DolphinDB 2.0用户手册​​》中“NULL 值的操作”一节有详细的说明。

 

3.1.2 其他数据类型

Kdb+ 数据类型

DolphinDB 数据结构

举例

list

ANY, MATRIX, DICTIONARY

(1,2,3)

enums

 

 

anymap

ANY DICTIONARY, DICTIONARY

a:1,b:2

dictionary

table

IN-MEMORY TABLE

 

  • ANY DICTIONARY 是 DolphinDB 中表示 JSON 的数据类型。
  • DolphinDB 的字典支持嵌套,键必须是标量,值可以是任何数据形式与数据类型。Kdb+ 的字典在输出或进行遍历时,键值对会保留输入时的顺序,而 DolphinDB 的字典按照 key 在 bucket 内的顺序输出键值对。
  • Kdb+ 的矩阵由嵌套的 list 表示,遵循行优先。DolphinDB 的矩阵有专门的数据类型 matrix,遵循列优先,Kdb+ 矩阵输入到 DolphinDB 时需要转换方向。
  • DolphinDB支持包括标量、向量、数据对、矩阵、集合、字典和表在内的多种数据形式,并针对不同的使用场景做了具体优化,请参考《DolphinDB 2.0文档》中“数据形式”一节。

 

3.1.3 数据类型检查函数

DolphinDB提供了 ​​typestr​​ 和 ​​type​​ 这两个用于检查数据类型。​​typestr​​ 返回的是数据类型的名称(字符串常量);​​type​​ 返回的是数据类型 ID(整数)。

 

3.2 关键字

3.2.1 control 类

Kdb+

DolphinDB

do

do-while

exit

 

if

if-else

while

do-while

 

3.2.2 env 类

Kdb+

DolphinDB

getenv

getEnv

gtime

gmtime

ltime

localtime

setenv

 

 

3.2.3 interpret 类

Kdb+

DolphinDB

eval

eval

parse

parseExpr

reval

 

show

print

system

shell

value

查询字典、表的值:

values

查询普通变量的值:

print

将字符串作为元代码执行:

parseExpr

将列表作为元代码执行:

expr

 

3.2.4 join 类

join 方式

Kdb+

DolphinDB

as-of join

aj, aj0, ajf, ajf0, asof

aj

equal join

ej

ej, sej

如何从 DolphinDB 数据库中的分区表中选择多个不同的列

将表插入到内存中现有的展开表导致错误:`type (Q/KDB+)

如何将 DolphinDB 集群迁移到另一台机器上

基于 DolphinDB 搭建微服务的 SpringBoot 项目

如何删除 DolphinDB 中的所有用户名?

使用 JDBC 在 KDB 数据库中执行查询

(c)2006-2024 SYSTEM All Rights Reserved IT常识