【发布时间】:2019-06-25 06:29:31
【问题描述】:
我尝试将架构中的第一列设置为字符串类型,但数据未在tickerplant中更新。
然后我更改了架构中符号类型的第一列,它运行良好。
在尝试调试时,我遇到了一篇文章,它说将时间跨度或符号类型的第一列放在表中总是好的。
- 为什么不能将String类型的列放在表的开头(因为String是字符列表(复杂类型)还是有其他原因)?
- 为什么在每个表的开头放置符号/时间跨度列是好的/要求?
【问题讨论】:
标签: kdb
我尝试将架构中的第一列设置为字符串类型,但数据未在tickerplant中更新。
然后我更改了架构中符号类型的第一列,它运行良好。
在尝试调试时,我遇到了一篇文章,它说将时间跨度或符号类型的第一列放在表中总是好的。
【问题讨论】:
标签: kdb
模式中使用的类型应该与 TP 中的 feedhandler 调用的函数很好地配合使用。当指定计时器时,我已经分解了 TP 的默认 .u.upd。
// All the following is defined in the .u context
upd:{[t;x]
// t - symbol
// x - list of lists
// Check if the first type is a timespan. First list should be a list of timespan
// Vanilla TP will add timespans to the data
if[not -16=type first first x;
// If the current time is greater than the gloabl .u.d then run the timer, causing an EOD
if[d<"d"$a:.z.P;
.z.ts[]];
// Get the timespan
a:"n"$a;
// Append the timespan on, handling differently if only a list of atoms
x:$[0>type first x;
a,x;
(enlist(count first x)#a),x]
];
// Insert the data
t insert x;
// if the handle .u.l is defined, add to the logfile and increment the total count .u.j
if[l;
l enlist (`upd;t;x);j+:1];
}
从这里你可以看到,默认情况下,TP 会假设第一列是临时的,如果不是,则添加时间跨度。如果您已经发送了时间戳,这很有用,因为您可以从提要中提取由 TP 处理所花费的时间。
通过首先发送一个字符串,TP 将在您的数据中添加一个额外的列。这将导致不匹配(如果您已经提供了时间跨度)或类型错误(通过将时间跨度插入字符串列,反之亦然)。
改变这一切将是微不足道的。例如,要检查第二列而不是第一列的时间跨度,它只是第一个 1_x。也许您总是想检查 EOD(即,如果您实际上以时间跨度作为第一列发送数据,在这种情况下,您会将 .z.ts[] 调用放在第一个 if 语句之外。
总结
【讨论】:
股票代码工厂处理的所有表格都必须有列 sym 作为符号。订阅者必须提供该表,并且可以提供他们订阅的一组可选的 sym 值。
理论上,sym 列也可以是字符串,但出于性能原因,sym 列更好。查找符号比查找字符串要快,因为符号比较只是幕后的整数比较。
【讨论】: