为什么kdb + tick中的第一列不能为String类型

时间:2019-06-25 06:29:31

标签: kdb

我尝试将架构中的第一列设置为String类型,但数据未在tickerplant中更新。

然后,我更改了架构中属于Symbol类型的第一列,并且该列运行良好。

在尝试调试时,我遇到了一篇文章,该文章指出在表中放置类型为timepan或symbol的第一列总是很好的。

  1. 为什么“字符串类型”列不能放在表的开头(因为“字符串”是字符列表(复杂类型),还是有其他原因)?
  2. 为什么在每个表格的开头放置符号/时间跨度列是一件好事/要求?

2 个答案:

答案 0 :(得分:2)

模式中使用的类型应该与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会假设第一列应该是临时的,如果不是,则添加时间跨度。如果您已经发送了时间戳,这将很有用,因为您可以从Feed中提取要由TP处理的时间。

通过首先发送一个字符串,TP将在您的数据中添加一个附加列。这将导致不匹配(如果您已经提供了时间跨度)或类型错误(通过将时间跨度插入到字符串列中,反之亦然)。

改变所有这些都是微不足道的。例如,要检查第二列而不是第一列的时间跨度,它将只是第一列1_ x。也许您总是想检查EOD(即,如果您实际上以时间跨度作为第一列来发送数据,在这种情况下,您可以将.z.ts []调用放在第一条if语句之外。

总结

  1. 列顺序取决于您使用的更新功能。时间跨度的增加可以更好地定时从提要到摄取的数据吞吐量。根据您要尝试执行的操作,您可能想要添加时间戳,或者只是使用在feedhandler中添加的时间值。
  2. 字符串和符号的使用详细说明here。我想说Ferenc部分不正确,强烈建议使用名为sym的列以符合标准,但是您可以更新代码以相对容易地使用其他列名(您需要将tick.q调整为不检查列时间和符号)。但这可能会使包括他人的工作更加困难。

答案 1 :(得分:1)

股票行情工厂处理的所有表都必须将列 sym 作为符号。订阅者必须提供表,并可以提供他们订阅的一组可选的sym值。

理论上,sym列也可以是字符串,但出于性能原因,symbol更好。查找符号比查找字符串要快,因为符号比较只是幕后的整数比较。