【问题标题】:KDB: How to serialize a table for a union join within kdb-tick architecture?KDB:如何在 kdb-tick 架构中为联合联接序列化表?
【发布时间】:2019-09-05 01:56:01
【问题描述】:

我正在尝试修改 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];};

随后在订阅者文件中设置ups:uj。 我的问题与在.u.ups[] 函数中发布表格行之前如何对其进行序列化有关。 IE。给定一张桌子:

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 将在该行和订阅者的本地表之间运行。 提前感谢您的建议。

【问题讨论】:

    标签: kdb


    【解决方案1】:

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

    1. 您不能在订阅者中设置ups:uj,因为表名是作为符号传递的,因此订阅者将有效地尝试这样做

    uj[`tab1;tab2]

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

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

    1. 标准的tickerplant 不是为处理可变/变化的架构而设计的 - 有充分的理由,拥有一个当日变化的架构通常不是一个好主意。但是,您的情况可能需要这样做,因此在这种情况下,您需要将 .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 进程,因此可能会也可能不会将表/字典发送到 tickerplant,因为通常 feedhandler 会发送列表(没有列元数据)。在您的情况下,您需要在每次更新时以某种方式将列元数据提供给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))
    

    【讨论】:

    • 再次感谢特里,在分析上述内容时,我基本上要做的是创建一个代表多个来源的特征表,即情绪、市场数据等。它是跨多个聚合的地方将制作表格,并且在这个程度上不需要高 I/O(1/秒),但是根据我的分析,它需要一个动态模式,您认为实现此目的的有效方法是什么?
    • 架构不一定会在当天更改,但与输入提要的配置有内在联系
    • 我想过实现一个模式检查,检查从 .u.upd 获得的列表的模式是否与聚合表的模式不同,然后在这种情况下更新模式,但是我我不确定那里的实现细节。我应该打开/编辑问题,以便进一步详细说明我的问题陈述吗?
    【解决方案2】:

    我假设这与您之前关于不同模式的几个问题有关。我想建议一个替代解决方案,只有在您使用使用 anymap 的 kdb 3.6 版时才真正可行。如果您可以将架构缩小到最小的公共列列表,则所有其他列都可以作为字典放入通用列中。

    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
    

    【讨论】:

    • 再次感谢 Callum,在分析上述内容时,我基本上要做的是创建一个代表多个来源的特征表,即情绪、市场数据等。它是跨多个聚合的地方将制作表格,并且在这个程度上不需要高 I/O(1/秒),但是根据我的分析,它需要一个动态模式,您认为实现此目的的有效方法是什么?
    • 架构不一定会在当天更改,但与输入提要的配置有内在联系
    • 我想过实现一个模式检查,检查从 .u.upd 获得的列表的模式是否与聚合表的模式不同,然后在这种情况下更新模式,但是我我不确定那里的实现细节。我应该打开/编辑问题,以便进一步详细说明我的问题陈述吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多