扩展元数据

Extended Metadata

kdb/q中的meta函数return关于table的以下信息:

  1. c –(符号)列名
  2. t – (char) 数据类型
  3. f –(符号)外键域
  4. a -(符号)属性。

我想对此进行扩展以包含有关 table 的更多信息。我要解决的具体情况是在 table.

中包含有关时间数据列的时区信息

例如: select from Price

+-------------------------+-------------------------+--------+-------+
|          Time           |         SysTime         | Ticker | Price |
+-------------------------+-------------------------+--------+-------+
| 2016.09.15D09:18:02.391 | 2016.09.15D08:18:02.391 | IBM    | 63.46 |
| 2016.09.15D09:18:02.491 | 2016.09.15D08:16:22.391 | MSFT   | 96.72 |
| 2016.09.15D09:18:02.591 | 2016.09.15D08:14:42.391 | AAPL   | 23.06 |
+-------------------------+-------------------------+--------+-------+

meta Price

+---------+---+---+---+
|    c    | t | f | a |
+---------+---+---+---+
| Time    | p |   |   |
| SysTime | p |   |   |
| Ticker  | s |   |   |
| Price   | f |   |   |
+---------+---+---+---+

我想获得有关元数据中时间数据列(TimeSysTime)的更多信息。

例如,像这样:

metaExtended Price

+---------+---+---+---+------------------+
|    c    | t | f | a |        z         |
+---------+---+---+---+------------------+
| Time    | p |   |   | America/New_York |
| SysTime | p |   |   | America/Chicago  |
| Ticker  | s |   |   |                  |
| Price   | f |   |   |                  |
+---------+---+---+---+------------------+

请注意,我有一个函数接受 table 和 return 时区的列。 TimeZone[Price;Time] returns America/New_York

我的问题只是关于如何将此信息包含在元函数中。我的第二个问题是,如果用户做这样的事情,newPriceTable:Price(创建一个与之前的 table 相同的新 table)然后 metaExtended函数应该 return 两个 table 的值相同(类似于在具有相同对象引用的两个不同变量上调用函数)

sql 中是否存在类似的东西?

meta 是保留字,因此不能重新定义。但是您可以创建自己的实现并使用它代替 meta:

TimeZone:{[Table;Col] ... } / your TimeZone function

metaExtended:{meta[x],'([]z:TimeZone[t]each cols x)}

metaExtended Price

关于你的第二个问题,我认为 k/q 不可能做你想做的事。在将 Price 分配给 newPriceTable 之后,后者确实是一个引用,但是一旦你修改它,kdb 就会创建一个副本并修改它而不是原来的。问题是没有办法判断 newPriceTable 是否仍然是对 Price 的引用或一个新的对象。

您可以使用 lj 将它们连接成一个元扩展函数。

该函数将检查所有时间 cols 和 运行 TimeZone 函数并将结果与​​元结果相结合:

      metaExtended:{[tbl] meta[tbl] lj  1!select c,z:TimeZone[tbl] each t from meta[tbl] where t in "tp"}

      metaExtended `t

当您将此 table 分配给新变量时,它将作为参考分配。

         nt:t / nt and t pointing to same object

你可以使用 -16 检查变量的引用计数! .

          -16!t

此时 metaExtended 函数将给出相同的输出。但是一旦对指向相同 table 的这些变量中的任何一个进行了一些更新,kdb 将为更新的 table/variable 创建一个新副本。从这一点来看,它们是两个不同的对象。现在 metaExtended 函数的输出取决于对象模式。