我正在尝试修改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将在该行与订阅者上的本地表之间运行。
预先感谢您的建议。
答案 0 :(得分:1)
其中一些可能会有所帮助:
ups:uj
,因为表名是作为符号传递的,因此订阅服务器将有效地尝试进行操作 uj[`tab1;tab2]
将不起作用,因为uj
不接受表名(符号)作为输入。您必须将ups
设置为
ups:{x set value[x] uj y}
.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