kdb dbmaint用现有数据回填数据

时间:2018-08-13 16:32:25

标签: kdb

我想使用dbmaint包在hdb中的所有日期中添加一列,然后用从同一表中的另一个现有列中的数据回填到我添加的列中,直到所有日期为止。

我刚刚在所有日期中添加了带有默认值的列。如何用来自另一列的数据回填该列?我不确定如何实现。

2 个答案:

答案 0 :(得分:4)

我认为您正在寻找copycol中的dbmaint.q函数。请注意,此功能不适用于嵌套列。

q)\l dbmaint.q
q)tables[]
`s#`depthsecond`quotessecond`tradessecond
q)tradessecond
date       sym  time                          src price size
------------------------------------------------------------
2018.07.16 AAPL 2018.07.16D08:00:00.078000000 N   25.32 1634
2018.07.16 AAPL 2018.07.16D08:00:03.419000000 O   25.35 1900
2018.07.16 AAPL 2018.07.16D08:00:03.504000000 O   25.32 627
2018.07.16 AAPL 2018.07.16D08:00:03.846000000 O   25.32 69
2018.07.16 AAPL 2018.07.16D08:00:07.177000000 O   25.32 4821
2018.07.16 AAPL 2018.07.16D08:00:07.373000000 O   25.35 2321
2018.07.16 AAPL 2018.07.16D08:00:11.861000000 L   25.33 545

q)
q)copycol[`:hdb2;`tradessecond;`price;`price_new]
2018.08.13 17:14:55 copying price to price_new in `:hdb2/2018.07.16/tradessecond
2018.08.13 17:14:55 copying price to price_new in `:hdb2/2018.07.17/tradessecond
2018.08.13 17:14:55 copying price to price_new in `:hdb2/2018.07.18/tradessecond
q)\l hdb2
q)tradessecond
date       sym  time                          src price size price_new
----------------------------------------------------------------------
2018.07.16 AAPL 2018.07.16D08:00:00.078000000 N   25.32 1634 25.32
2018.07.16 AAPL 2018.07.16D08:00:03.419000000 O   25.35 1900 25.35
2018.07.16 AAPL 2018.07.16D08:00:03.504000000 O   25.32 627  25.32
2018.07.16 AAPL 2018.07.16D08:00:03.846000000 O   25.32 69   25.32

如您所见,tradessecond表现在包含price_new列。如果您的大小写不同(嵌套列,或者您不想复制示例中显示的列),则必须手动进行更新(遍历所有分区,向下保存列,更新{{1} }文件并在必要时枚举。

答案 1 :(得分:3)

根据Alex的解决方案-如果您想要与现有列完全相同,copycol可以使用。

如果要从现有列创建派生的列,则还需要使用fncol函数将lambda应用于该列。例如,创建价格列的副本,然后将新列中的所有价格翻倍:

copycol[`:hdb;`table;`price;`price_new];
fncol[`:hdb;`table;`price_new;{2*x}];

lambda不包含表中的任何其他信息,它仅包含来自要修改的列的值。

但是,如果您的派生列更高级,并且需要表中两个或更多列的数据,那么您将需要对vanilla dbmaint包进行一些修改,如下所示:

创建新版本的fncol,它将当前目录路径传递给函数

fncol2:{[dbdir;table;col;fn]
 {fn1col[z;x;y@z]}[col;fn;]each allpaths[dbdir;table];};

然后,您可以在lambda中根据需要添加其他列,例如,如果要添加两个价格列:

{[path;vector] vector + get ` sv path,`otherPriceCol}

因此,总体而言,您的复制和修改命令为:

copycol[`:hdb;`table;`price;`price_new];
fncol2[`:hdb;`table;`price_new;{[path;vector] vector + get ` sv path,`otherPriceCol}];