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

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

我试图修改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;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}

  • 一个标准的tickerplant并不是设计用来处理可变/变化的模式的——有很好的理由,让一个模式在一天内变化通常不是一个好主意。但是,您的情况可能会保证这样做,因此在这种情况下,您需要将
    .u.ups
    函数修改为
  • 您的feeder进程必须将kdb表或kdb字典发送到
    .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}

  • 一个标准的tickerplant并不是设计用来处理可变/变化的模式的——有很好的理由,让一个模式在一天内变化通常不是一个好主意。但是,您的情况可能会保证这样做,因此在这种情况下,您需要将
    .u.ups
    函数修改为
  • 您的feeder进程必须将kdb表或kdb字典发送到
    .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/秒)然而,从我的分析来看,这需要一个动态模式,您认为实现这一点的有效方法是什么?模式不一定会在一天内改变,但与输入反馈的配置有内在联系。我曾想过实施一个模式检查,以确保