【问题标题】:Select query on kdb+ TSDB table with nested dictionary使用嵌套字典在 kdb+ TSDB 表上选择查询
【发布时间】:2015-11-30 00:12:48
【问题描述】:

为了在 kdb+ TSDB 中存储按标签分组的基于时间的数据,我创建了一个包含 timestampvaltags 列的表。标签是键值对,所以我在tags列中使用了一个字典来存储这些信息。

创建表的查询:

myTable:([]timestamp:-12h$();val:-9h$();tags:());

插入一些示例数据的查询:

`myTable insert ("P"$"2015-11-30 13:10:45.126381"; 521.45117; `house`room!215 111)

如何获取 215 号房屋的所有数据/行?我尝试了以下查询但没有成功(类型错误):

select from myTable where tags[`house]=215

感谢任何帮助。

【问题讨论】:

    标签: database dictionary tags time-series kdb


    【解决方案1】:

    要访问字典中的元素,您需要深度索引 - 在这种情况下需要处理 2 级嵌套。外索引是行数,内索引是字典键。

    在 q 中,要深度索引 (elide),您可以省略其中一个索引级别,在这种特殊情况下,查询将是:

    q) select from myTable where tags[;`house]=215
        timestamp                     val      tags
        ----------------------------------------------------------
        2015.11.30D13:10:45.126381000 521.4512 `house`room!215 111
    

    注意事项:如果每行中的 tags 字典不是同质的(相同的键 + 相同的值类型),您可能会在 tags 字典缺少house 键,因为 Kdb+ 将返回一个可能不是预期类型的​​空值。因此,可能需要使用匹配运算符 (~)。

    例如:

    q) select from myTable where tags[;`house]~\:215
        timestamp                     val      tags
        ----------------------------------------------------------
        2015.11.30D13:10:45.126381000 521.4512 `house`room!215 111
    

    注意,这里使用了左右两边的 (\:) 副词。有关副词的更多详细信息,请参阅here

    【讨论】:

    • 感谢您的帮助!一些数据/行没有标签。因此,是否可以在表格列中创建一个空字典,所以我仍然可以使用您的第一个解决方案(没有匹配运算符)?
    • 您可以在每一行中添加一个标记值,并将所有预期的键值设置为适当类型的空值,但这会不必要地增加内存和磁盘空间的使用。此外,如果空值在 tge 数据中有意义,则可能不合适。如果您不想 ro 使用匹配运算符来处理行可能没有标签的情况,您可以在 select 中添加一个附加子句,在检查值类型的字典检查之前,以确保它是字典/或在使用空字典的情况下确保字典中至少有 1 个条目。
    猜你喜欢
    • 2020-06-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    相关资源
    最近更新 更多