KDB:如何在KDB体系结构中序列化联合联接的表?
我试图修改kdb tick体系结构,以支持传入数据和本地rdb表的联合联接。 我已将tick.q文件中的KDB:如何在KDB体系结构中序列化联合联接的表?,kdb,Kdb,我试图修改kdb tick体系结构,以支持传入数据和本地rdb表的联合联接。 我已将tick.q文件中的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;f
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];};
(`.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))
随后在订户文件中设置了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
,以便通过.u.ups
函数将其发送给订阅服务器,从而在订阅服务器上的行和本地表之间运行uj。
提前感谢您的建议。有些建议可能会有所帮助:
ups:uj
,因为表名是作为符号传递的,因此订阅服务器将有效地尝试这样做uj[`tab1;tab2]
这将不起作用,因为uj
不接受表名(符号)作为输入。您必须将ups
设置为
ups:{x设定值[x]uj y}
.u.ups
函数修改为.u.ups
函数。由于feedhandler进程通常不是kdb进程,因此可能无法向tickerplant发送表/字典,因为feedhandler通常会发送列表(没有列元数据)。在您的情况下,您需要在每次更新时以某种方式向tickerplant提供列元数据(或者您可能已经这样做了?),否则它将不知道哪些列是哪些列
换句话说,您的进料器进程可以发送以下任一项:
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];};
(`.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))
其中一些可能会有所帮助:
ups:uj
,因为表名是作为符号传递的,因此订阅服务器将有效地尝试这样做uj[`tab1;tab2]
这将不起作用,因为uj
不接受表名(符号)作为输入。您必须将ups
设置为
ups:{x设定值[x]uj y}
.u.ups
函数修改为.u.ups
函数。由于feedhandler进程通常不是kdb进程,因此可能无法向tickerplant发送表/字典,因为feedhandler通常会发送列表(没有列元数据)。在您的情况下,您需要在每次更新时以某种方式向tickerplant提供列元数据(或者您可能已经这样做了?),否则它将不知道哪些列是哪些列
换句话说,您的进料器进程可以发送以下任一项:
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];};
(`.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))
我将假设这与您之前关于不同模式的几个问题有关。我想建议一个替代解决方案,它只有在使用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
集成到标准摄取程序中将在计算上花费巨大。使用通用的列和字典方法将大大提高您的摄取速度。下面我用前面给出的答案演示了你的一个相关问题
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
我将假设这与您之前关于不同模式的几个问题有关。我想建议一个替代解决方案,它只有在使用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
集成到标准摄取程序中将在计算上花费巨大。使用通用的列和字典方法将大大提高您的摄取速度。下面我用前面给出的答案演示了你的一个相关问题
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
再次感谢Callum,在对上述内容的分析中,我尝试创建一个代表多个来源的特征表,即情绪、市场数据等。这是跨多个表进行聚合的地方,因此不需要高I/O(1/秒)然而,从我的分析来看,这需要一个动态模式,您认为实现这一点的有效方法是什么?模式不一定会在一天内改变,但与输入反馈的配置有内在联系。我曾想过实施一个模式检查,以确保