首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >扩展元数据

扩展元数据
EN

Stack Overflow用户
提问于 2016-09-15 14:25:05
回答 2查看 211关注 0票数 0

kdb/q中的meta函数返回有关表的以下信息:

  1. C-(符号)列名
  2. T- (char)数据类型
  3. 外键的F-(符号)域
  4. A-(符号)属性

我想将此扩展到包括更多关于该表的信息。我试图解决的具体情况是在表中包含有关时间数据列的时区信息。

例如:select from Price

代码语言:javascript
复制
+-------------------------+-------------------------+--------+-------+
|          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

代码语言:javascript
复制
+---------+---+---+---+
|    c    | t | f | a |
+---------+---+---+---+
| Time    | p |   |   |
| SysTime | p |   |   |
| Ticker  | s |   |   |
| Price   | f |   |   |
+---------+---+---+---+

我想了解有关时间数据列(TimeSysTime)在元中的其他信息。

例如,如下所示:

metaExtended Price

代码语言:javascript
复制
+---------+---+---+---+------------------+
|    c    | t | f | a |        z         |
+---------+---+---+---+------------------+
| Time    | p |   |   | America/New_York |
| SysTime | p |   |   | America/Chicago  |
| Ticker  | s |   |   |                  |
| Price   | f |   |   |                  |
+---------+---+---+---+------------------+

请注意,我有一个函数,它接受表和列来返回时区。TimeZone[Price;Time]返回America/New_York

我的问题只是关于如何将这些信息包含在元函数中。我遇到的第二个问题是,如果用户这样做,newPriceTable:Price (创建一个与上一个表相同的新表),那么metaExtended函数应该为两个表返回相同的值(类似于对具有相同对象引用的两个不同变量调用函数)。

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-09-15 14:53:02

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

代码语言:javascript
复制
TimeZone:{[Table;Col] ... } / your TimeZone function

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

metaExtended Price

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

票数 2
EN

Stack Overflow用户

发布于 2016-09-15 15:07:25

您可以使用lj将它们连接到一个metaExtended函数中。

该函数将检查所有时间的cols并在其上运行TimeZone函数,并将结果与元结果连接:

代码语言:javascript
复制
      metaExtended:{[tbl] meta[tbl] lj  1!select c,z:TimeZone[tbl] each t from meta[tbl] where t in "tp"}

      metaExtended `t

当您将此表赋值给新变量时,它将被赋值为引用。

代码语言:javascript
复制
         nt:t / nt and t pointing to same object

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

代码语言:javascript
复制
          -16!t

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39513630

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档