
一、enumeration和cast
q中cast操作符($)可用于数据类型转换,将右侧参数的转换为左侧参数指定的数据类型,左侧参数的可以是代表数据类型的symbol、char或者short(可参考《kdb+中文教程》第二章第七节)。q中的enumeration对此功能做了进一步拓展,将$的左侧参数扩展为用户自定义的目标域。因此枚举功能实际上是更通用的一种cast。
二、什么是枚举?
q中将一个symbol数组转化为元素为索引的数组的过程称为枚举。
枚举的写法为:`u$v
其中v是元素类型为symbol的数组(通常而言是存在重复的symbol数组),u是这个枚举的定义域(取值范围),是一个不重复的symbol数组,枚举的结果是一个索引数组k,存放v中每个元素在u中的位置。
我们知道,q中,list、字典、表、函数等都是映射,枚举也可以理解为是一种映射,将不唯一的数组v通过索引k,映射到唯一的数组u,即v=u[k]。
三、枚举的作用
为什么要做枚举?第一,v是一个可变长度的symbol数组,直接对v进行搜索效率低,而k是一个简单的整数型数组,便于快速处理。第二,一般而言,v中有许多存在重复的symbol元素,而u只需要存储每个symbol元素一次,因此通过枚举,可减少存储冗余数据,只保留所需的最小数据集,从而提高数据处理效率。第三,便于数据的更新维护(将在第四部分举例说明)。
四、枚举示例
q)u:4?`3 /随机生成4个长度为3的symbol
q)u
`ddo`gmh`kfh`kgn
q)v:10000?u
q)v
`kgn`kgn`ddo`kfh`gmh`kfh`kfh`ddo`ddo`gmh`gmh…
q)k:`u$v
q)`int$k
3 3 0 2 1 2 2 0 0 1 1…
注意:对symbol类型做枚举时,所有v中的值都必须在数组u中,否则将返回cast错误。承上例:
q)`u$`ddd
'cast
前面讲到,枚举的一个好处是方便数据更新维护,下面将举例说明。承上例,假如我们要将v中所有的`kfh修改为`hfk,只需要对u做一次更新,k:
q)u[2]:`hfk
q)k /k中所有的`kfh将自动修改为`hfk
`u$`kgn`kgn`ddo`hfk`gmh`hfk`hfk…
不需要通过类似v[where v=`kfh]:`hfk 的操作对v进行修改。
如果要在数组k中增加新的元素,必须先将该元素添加进u中,例如,在k中增加一个新的元素`zzu:
q)k,:`zzu
'cast
`zzu必须要先添加进u中:
q)u,:`zzu
q)k,:`zzu
若不能预先知道枚举域的完整范围,可以使用“?”先检查元素是否在u中,若不在,则将给元素追加在原枚举域u中,否则保持u不变。例如:
q)`u?`opq
`u$`opq
q)k,:`opq
五、枚举的其他应用
1、外键
外键是数据库中建立表关系的一种机制,简单地说,若表B中的列元素来自表A中主键列,则表B中的列称为外键,表B通过外键和表A建立了关联,表B中外键列的值域被表A的主键列所限制。
在kdb+中,外键(foreign key)是一个表中的一列或多列,其值被定义为另一个键表的主键列上的枚举,与符号枚举'sym$的情况一样,外键列的值被键表主键值列所限制。因此,kdb+中的外键实际上是枚举的一种应用。
通过建立外键,可以使用dot(.)表达法(表B外键列名.主表A列名)方便地取出主表A中的字段,不需显式执行表连接。
q)kt:([eid:1001 1002 1003] name:`Ann`Bob`David;age:16 21 18)
q)tdetails:([] id:`kt$1003 1001 1002 1001 1002 1001; score:96 87 92 79 98 62) / 表tdetials建立了外键列id,id来自主表kt的主键列eid
q)meta tdetails
c | t f a
-----| ------
id | j kt
score| j
q)select id.name, id.age,score from tdetails
name age score
---------------
David 18 96
Ann 16 87
Bob 21 92
Ann 16 79
Bob 21 98
Ann 16 62
2、分列表和分区表存储
kdb+中,对包含symbol列的表做分列、分区存储时,所有的symbol列都需要执行枚举操作,一般通过系统函数.Q.en进行,更多内容可参考《kdb+中文教程》第八章。
此外,kdb+不能对主键表做分列,因此分列表之间不能通过外键进行关联,但可通链接列(link column)进行关联,链接列类似外键,也是枚举的一种应用,不同的是,主表可以是键表,也可以不是键表。更多内容可参考《kdb+中文教程》第十章问答18和19。
《kdb+中文教程》
全文链接

《kdb+中文教程》
主要内容

kdb+号称是世界上最快的内存数据库,q是kdb+的内置语言。事实上kdb+/q不只是内存数据库,更是一款高性能大数据平台,它使用统一的数据库处理实时数据和历史数据,同时具备CEP(复杂事件处理)引擎、内存数据库、磁盘数据库等功能。与传统关系数据库及现代大数据平台相比,kdb+/q具有更快的速度和更低的总拥有成本,非常适合海量数据的快速采集、存储、分析、处理和检索等。kdb+/q最初主要被用于金融机构海量数据分析和高频交易,目前被广泛用于人工智能、机器学习、物联网、智能电网、航天等领域。
《kdb+中文教程》是一本关于kdb+/q的中文入门书籍,内容分为三大部分:
第一部分(第一章)为kdb+/q简介,主要介绍kdb+/q的优势及不同许可类型,同时介绍了kdb+/q的下载、安装、基本操作及数据表操作等。通过学习本章,读者可以快速了解kdb+/q的特性,同时对kdb+/q的独特、简洁等有一个初步直观感受。
第二章至第八章为第二部分,是本书的核心内容,分别为数据类型、数组、函数、字典、表与qSQL、I/O操作及数据库。首先介绍了kdb+/q的基本数据类型,然后介绍了kdb+/q的数组(列表)、函数、字典、表,最后介绍了文件I/O操作、进程间通讯、数据库构建等。通过这部分内容的学习,读者可以掌握kdb+/q的基础知识,为kdb+/q的运用打下坚实基础,逐步将kdb+应用于实际场景,同时能进一步感受kdb+/q的简洁、灵活与强大等。
第三部分包括第九章和第十章。第九章通过实例介绍kdb+在股票期货数据处理方面的常见应用,包括历史行情数据库构建、策略回测与优化、实时行情处理等,并简单介绍了企业级开源证券期货交易平台Tx。第十章把一些可能有用的知识点以问答形式列出来,方便读者需要时查找。通过这部分内容的学习,读者可以参考常见应用实例,举一反三。




