【问题标题】:Kdb+/q: How to bulk insert into a KDB+ table with an index?Kdb+/q:如何批量插入带有索引的 KDB+ 表?
【发布时间】:2019-08-23 09:05:53
【问题描述】:

我正在尝试将多条记录同时批量插入到 KDB+ 数据库中:

> trades:([]time:`datetime$();side:`symbol$();qty:`float$();price:`float$();exch:`symbol$();sym:`symbol$())
> t: .z.z   / intentionally the same time
> `trades insert (t t;`buy `sell;10 10;10 10;`exch `exch;`sym `sym)

但是它会在 sym 列中引发错误 '符号

  [0]  `depths insert (t t;`buy `sell;10 10;10 10; `exch `exch;`sym `sym)
                                                               ^

不知道我在这里做错了什么,但它似乎是值不变的,即它总是在最后一列引发错误,而不管提供的值如何。 有人可以告诉我如何将批量记录插入到 kdb+ 中,并使用上面描述的时间索引。

谢谢

【问题讨论】:

    标签: time-series bulkinsert kdb


    【解决方案1】:

    在您原来的插入语句中,您之间有空格 `sym `sym , `exch `exch`buy `sell。符号之间的空格使其成为应用或索引,而不是您想要的列表。 此外,因为您已将 qtyprice 指定为 float ,当您插入到 trades 桌子。 以下行应该完成您打算做的事情:

    `trades insert (2#t;`buy`sell;10 10f;10 10f;`exch`exch;`sym`sym)

    最后,我建议将qty列的架构更改为int/long,因为数量通常不需要小数点。 希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      丹尼尔正在赚钱。为了扩展他的答案,q 会将空格分隔的列表整理到一个数值对象中,即使这样,类型规范也必须仅存在于最后一项。有关列表创建的更多详细信息,请参见here

      q)a:10f 10f
      '10f
      q)a:10 10f
      

      其次,对于那些学习 kdb 的人来说,在追加到表时经常遇到类型错误是很常见的。这种情况下的问题是 kdb 没有将同质原子列表提升为更广泛的类型(expected behaviour)。以下是一个有用的小 lambda,可让您在执行 insertupsert 操作时知道哪里出错了:

      q)trades:([]time:`datetime$();side:`symbol$();qty:`float$();price:`float$();exch:`symbol$();sym:`symbol$())
      q)rows:(t,t;`buy`sell;10 10;10 10;`exch`exch;`sym`sym)
      q)insertTest:{[tab;rows] m:0!meta tab; wh: where not m[`t] ~' rt:.Q.ty each rows; @[flip;;enlist] `item`currType`expectedType!(m[`c] wh;rt wh; m[`t] wh)}
      item  currType expectedType
      ---------------------------
      qty   j        f
      price j        f
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多