Time series 如何使用kdb+;跟踪任意数量的IOT标量流?
我正在尝试使用kdb+捕获并聚合从物联网传感器收集的大量感官流 每个传感器都有一个唯一的标识符,即时间分量(.z.z)和标量值:Time series 如何使用kdb+;跟踪任意数量的IOT标量流?,time-series,multiple-columns,kdb,column-aggregation,Time Series,Multiple Columns,Kdb,Column Aggregation,我正在尝试使用kdb+捕获并聚合从物联网传感器收集的大量感官流 每个传感器都有一个唯一的标识符,即时间分量(.z.z)和标量值: percepts:([]time:`datetime$(); id:`symbol$(); scalar:`float$()) 然而,由于数据本质上是暂时的,因此在不同的列中保持单独的感知/感觉流似乎是合乎逻辑的,即: time id_1 id_2 ... 15 0.15 ... 16 ... 1.5 但是,以指示性方式追加到
percepts:([]time:`datetime$(); id:`symbol$(); scalar:`float$())
然而,由于数据本质上是暂时的,因此在不同的列中保持单独的感知/感觉流似乎是合乎逻辑的,即:
time id_1 id_2 ...
15 0.15 ...
16 ... 1.5
但是,以指示性方式追加到表只支持插入方式的行操作,即percepts insert(.z.z;`id_1;0.15)
似乎我希望在此设置中支持大量非静态的传感器,在进行转换以根据其id将行转换为列之前,添加上述格式的行似乎是一种反模式。是否可能/有必要创建一个具有动态(增长)的表基于新要素流的列数
如何最有效地实现允许插入列式时间序列数据的逻辑,从而避免对基于行的数据进行转换?您可以向特定列添加数据。为此,请进行以下更改:
- 将
列永久或在更新操作期间设置为键time
- 使用
添加数据并以表格格式传递数据李>upsert
- 它首先检查表是否为空,在这种情况下,将表模式设置为输入数据集模式(根据您的示例,应该是time和sensor name列),并将time设置为主键
- 如果表格中有数据,但新传感器缺少该列,则首先添加一个具有空浮点值的列,然后向上插入数据
- 如果列已经存在,则只需向上插入数据
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)]
你需要考虑的另一点是,如果你一直在增加传感器,那么它就会有一个胖表,这就有它自己的问题了。此外,它将成为一个单一的瓶颈点,这可能是一个问题,在未来和扩展它将是困难的
对于小型传感器组,当前的设计很好,但如果您计划在将来添加许多传感器,请考虑其他设计选项。嘿,Rahul,感谢您的书面回答。我曾考虑过bucketing,但问题是如何以在线方式实现这一点,即当数据到达时,它被添加到一个时间段,类似于kdb+tick架构的东西可能会在此后工作。你能举出一个例子,说明在线时间计费是以这种方式实现的吗。感谢againHi Kyle,您需要在服务上实现bucketing逻辑。一旦您的服务从提要处理程序获得数据,您就可以根据数据中的时间找到正确的bucket,然后将其存储在其中。另外,如果您的逻辑支持运行聚合,而不是将原始值存储在bucket中,那么您可以直接将聚合值存储在bucket中
time id1 id2
--------------------------------
2019.08.26T13:35:43.203 14.4
2019.08.26T13:35:46.861 2.3