KDB:如何在kdb-tick体系结构中为联合联接的表序列化?

时间:2019-09-05 01:56:01

标签: kdb

我正在尝试修改kdb-tick体系结构,以支持对传入数据和本地rdb表的联合联接。 我已将tick.q文件中的json["property"]函数修改为以下内容:

upd

随后在订户文件中设置了ups:{[t;x]ts"d"$a:.z.P; if[not -16=type first first x;a:"n"$a;x:$[0>type first x;a,x;(enlist(count first x)#a),x]]; f:key flip value t;pub[t;$[0>type first x;enlist f!x;flip f!x]];if[l;l enlist (`ups;t;x);i+:1];}; 。 我的问题涉及到在ups:uj函数中发布表行之前如何对其进行序列化。 即给一张桌子:

.u.ups[]

应该如何序列化第一行second | amount price -----------|---------------- 02:46:01 | 54 9953.5 02:46:02 | 54 9953.5 02:46:03 | 54 9953.5 02:46:04 | 150 9953.5 02:46:05 | 150 9954.5 ,以便可以通过02:46:01 | 54 9953.5函数将其发送给订阅者,从而uj将在该行与订阅者上的本地表之间运行。 预先感谢您的建议。

2 个答案:

答案 0 :(得分:1)

其中一些可能会有所帮助:

  1. 您无法在订阅服务器中设置ups:uj,因为表名是作为符号传递的,因此订阅服务器将有效地尝试进行操作

uj[`tab1;tab2]

将不起作用,因为uj不接受表名(符号)作为输入。您必须将ups设置为

ups:{x set value[x] uj y}

  1. 标准的滴答器并非设计用于处理可变/更改模式-出于充分的理由,拥有日内更改的模式通常不是一个好主意。但是,您的情况可能需要这样做,因此在这种情况下,您需要将.u.ups函数修改为类似的内容
\d .u
ups:{[t;x]ts"d"$a:.z.P;
    x:`time xcols update time:"n"$a from x;
    pub[t;$[98h=type x;x;1=count last x;enlist x;flip x]];if[l;l enlist (`ups;t;x);i+:1];};
\d .

,您的供稿器进程将必须将kdb表或kdb词典发送到.u.ups函数。由于feedhandler进程通常不是kdb进程,因此可能或不可能将表/词典发送到报价器,就像通常feedfeedler会发送列表(没有列元数据)一样。在您的情况下,您需要在每次更新时以某种方式将列元数据提供给tickerplant(或者您是否已经在这样做?),否则它将不知道哪些列是哪一列。

换句话说,您的供稿器进程可以发送以下任一消息:

(`.u.upd;`tab;([]col1:`a`b`c;col2:1 2 3))
(`.u.upd;`tab;`col1`col2!(`a;1))
(`.u.upd;`tab;`col1`col2!(`a`b;1 2))

答案 1 :(得分:1)

我将假定这与您先前有关异构模式的几个问题有关。我想提出一个替代解决方案,该解决方案仅在使用kdb 3.6版(使用anymap)的情况下才切实可行。如果您可以将架构缩小到最小的公共列列表,则所有其他列都可以作为字典放置在常规列中。

q)tab:([]sym:`$();col1:`float$();colGeneral:(::))
q)`tab upsert (`AAPL;3.454;(`colX`colY`colZ!(1;2.3;"abc")))
`tab
q)`tab upsert (`MSFT;3.0;(`colX`colY!(2;100.0)))
`tab
q)`tab upsert (`AMZN;100.0;((enlist `colX)!(enlist 10)))
`tab
q)tab
sym  col1  colGeneral
----------------------------------------
AAPL 3.454 `colX`colY`colZ!(1;2.3;"abc")
MSFT 3     `colX`colY!(2;100f)
AMZN 100   (,`colX)!,10
q)select colGeneral from tab
colGeneral
-----------------------------
`colX`colY`colZ!(1;2.3;"abc")
`colX`colY!(2;100f)
(,`colX)!,10
q)select sym, colGeneral @\: `colX from tab
sym  x
-------
AAPL 1
MSFT 2
AMZN 10
q)select sym, colGeneral @\: `colY from tab
sym  x
---------
AAPL 2.3
MSFT 100f
AMZN 0N

使用3.6可以将其以任何扩展格式(扩展,分区,分段)保存到磁盘,并且仍然可以轻松查询数据。由于常规列的压缩特性不佳(假设您希望压缩数据),因此此类表的存储可能不是最佳的,但是它的功能非常完善。

每次更新都将uj集成到标准提取过程中,在计算上会非常昂贵。使用常规的列和字典方法将大大提高您的摄取速度。下面,我使用example进行了演示,并给出了您相关问题的先前答案

q)table:()
q)row1:enlist `x`y`colX!(`AMZN;100.0;10)
q)table:table uj row
q)\ts:100000 table:table uj row1
13828 6292352
q)\ts:100000 `tab upsert (`AMZN;100.0;((enlist `colX)!(enlist 10)))
117   12746880