Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Time series 如何使用kdb+;跟踪任意数量的IOT标量流?_Time Series_Multiple Columns_Kdb_Column Aggregation - Fatal编程技术网

Time series 如何使用kdb+;跟踪任意数量的IOT标量流?

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 但是,以指示性方式追加到

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

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

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
    添加数据并以表格格式传递数据
我在下面提到的更新函数是特定于您的示例的,但您可以使其更通用。它将传感器名称和传感器数据作为输入。它执行3个步骤:

  • 它首先检查表是否为空,在这种情况下,将表模式设置为输入数据集模式(根据您的示例,应该是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