【问题标题】:How to use kdb+ to track an arbitrary number of IOT scalar streams?如何使用 kdb+ 跟踪任意数量的 IOT 标量流?
【发布时间】:2019-12-29 22:22:51
【问题描述】:

我正在尝试使用 kdb+ 来捕获并聚合从物联网传感器整理的大量感官流。

每个传感器都有一个唯一标识符、一个时间分量 (.z.z) 和一个标量值:

percepts:([]time:`datetime$(); id:`symbol$(); scalar:`float$())

但是,由于数据本质上是时间性的,因此在不同的列中维护单独的感知/感觉流似乎是合乎逻辑的,即:

time  id_1    id_2 ...
15    0.15     ...
16    ...      1.5

但是,附加到表指示性仅支持插入方式的行操作,即感知插入 (.z.z; `id_1; 0.15)

看起来好像我想在此设置中支持大量非静态传感器,在随后进行转换以将行转换为之前附加上述格式的行似乎是一种反模式基于其 id 的列。是否有可能/有必要根据新的特征流创建一个列数动态(不断增长)的表?

如何最有效地实现允许插入列式时间序列数据以避免需要对基于行的数据进行转换的逻辑?

【问题讨论】:

    标签: time-series multiple-columns kdb column-aggregation


    【解决方案1】:

    您可以将数据添加到特定列。为此进行以下更改:

    • time 列为永久或更新操作期间的键。
    • 使用upsert添加数据并以表格格式传递数据。

    我在下面提到的更新功能特定于您的示例,但您可以使其更通用。它将传感器名称和传感器数据作为输入。它执行 3 个步骤:

    • 它首先检查表是否为空,在这种情况下,将表架构设置为输入数据集架构(根据您的示例应该是时间和传感器名称列),并将时间作为主键。
    • 如果表中有数据但新传感器缺少该列,则首先添加一个具有空浮点值的列,然后插入数据。
    • 如果一列已经存在,那么只需更新数据。

      q)t:() / table to store all sensors data
      q)upd:{[s;tbl] `t set $[0=count t;`time xkey 0#tbl;not s in cols t;![t;();0b;enlist[s]!enlist count[t]#0Nf];t] upsert tbl}
      
      q)upd[`id1;([]time:1#.z.z;id1:1#14.4)]
      q)upd[`id2;([]time:1#.z.z;id2:1#2.3)]
      
    time                    id1  id2
    --------------------------------
    2019.08.26T13:35:43.203 14.4    
    2019.08.26T13:35:46.861      2.3
    

    关于您的设计的几点:

    如果所有传感器都没有为每个时间条目发送数据,那么该表将有很多空值(类似于稀疏矩阵),这将浪费内存并且还会对查询产生一些影响。 在这种情况下,您可以根据您的用例考虑其他设计。例如,不是存储每个时间条目,而是将数据存储在时间桶中。另一种选择是将相关传感器分组到不同的表中,而不是全部存储在一个表中。

    您需要考虑的另一点是,如果您继续向其中添加传感器,您将拥有一个胖表,这有其自身的问题。此外,它将成为一个单一的瓶颈点,这可能会成为未来的一个问题,并且很难扩展它。

    对于小型传感器组,目前的设计很好,但如果您计划在未来添加许多传感器,那么请考虑其他设计选项。

    【讨论】:

    • 嘿拉胡尔,感谢您写得很好的答案。我已经考虑过分桶,但是问题出现了如何以在线方式完成此任务,即当数据到达时,它被添加到时间桶中,类似于 kdb+ 滴答架构的东西可能在此后起作用。您能否参考一个以这种方式实施在线时间分桶的示例。再次感谢
    • 嗨,Kyle,您需要在您的服务上实现分桶逻辑。一旦您的服务从提要处理程序获取数据,您就可以根据数据中的时间找到正确的存储桶,然后将其存储在其中。此外,如果您的逻辑支持运行聚合,而不是将原始值存储在存储桶中,您可以直接将聚合值存储在存储桶中。
    • 感谢拉胡尔的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 2019-10-05
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多