暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

kdb+中的枚举

kdb中文教程 2020-12-22
394



一、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+中文教程》

  全文链接

前言及目录
第一章  简介

第二章  数据类型

第三章  数组

第四章  字典

第五章  函数

第六章  表与qSQL

第七章  I/O操作

第八章  数据库

第九章  应用例子

第十章  问答(含参考文献)

《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。第十章把一些可能有用的知识点以问答形式列出来,方便读者需要时查找。通过这部分内容的学习,读者可以参考常见应用实例,举一反三。



文章转载自kdb中文教程,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论