使用q中的.Q.ind []更新分区表中的单元格

时间:2019-02-07 16:23:01

标签: kdb

我有一个分区表,可以像这样使用get命令读取它: 得到`:hdb / 2018.01.01 / trade

并且会给我:

sym size exchange
-----------------
0   100  2
1   200  2
1   300  2

在给定索引或行列表的情况下,我喜欢将单元格值的大小从200和300修改为1000。所以我正在使用

.Q.ind[`:hdb/2018.01.01/trade; 1 2j]

获取行,然后更改单元格。但是我在运行.Q.ind []时遇到了“排名错误”。

2 个答案:

答案 0 :(得分:2)

您得到的错误是.Q.ind的第一个输入参数是映射的表名,而不是代表表名/位置的符号

我不确定.Q.ind是否会在这里为您提供帮助,它对于数据检索比对数据(重新)写入更为有用。

您可以采取的两种方法:

  1. 将整个日期片select from table where date=X拉入,在内存中进行修改,然后使用`:hdb/2018.01.01/trade/ set delete date from modifiedTable将其写回。这是假设您不修改任何枚举/符号列。您必须小心维护相同的架构,保持相同的压缩等
  2. 使用dbmaint软件包来处理更改:https://github.com/KxSystems/kdb/blob/master/utils/dbmaint.md
  3. 如果您足够小心,则可以仅拉入列本身,对其进行修改并将其写回。 p set @[get p:`:hdb/2018.01.01/trade/col1;1 2;:;1000]

答案 1 :(得分:1)

您还可以使用修改操作来更新值。

@[`:hdb/2018.01.01/trade;`size;@[;1 2;:;1000]

这将在磁盘上编辑表。

q)get`:hdb/2018.01.01/trade
sym size exchange
-----------------
0   100  2
1   200  2
1   300  2

q)@[`:hdb/2018.01.01/trade;`size;@[;1 2;:;1000]]
`:hdb/2018.01.01/trade
q)get `:hdb/2018.01.01/trade/
sym size exchange
-----------------
0   100  2
1   1000 2
2   1000 2