kdb dbmaint使用现有数据回填数据

kdb dbmaint使用现有数据回填数据,kdb,Kdb,我想使用dbmaint包将一列添加到hdb中的所有日期,然后使用同一表中另一个现有列的数据将我添加的列回填到所有日期 我只是在所有日期中添加了一列默认值。如何使用另一列中的数据回填该列?我不知道如何才能做到这一点 我认为dbmaint.q中的copycol功能正是您需要的。请注意,此函数不适用于嵌套列 q)\l dbmaint.q q)tables[] `s#`depthsecond`quotessecond`tradessecond q)tradessecond date sym

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


我只是在所有日期中添加了一列默认值。如何使用另一列中的数据回填该列?我不知道如何才能做到这一点

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

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\u new
列。如果您有不同的情况(嵌套列或您不想复制我在示例中所示的列),则必须手动执行更新(在所有分区中重复,向下保存列,更新
.d
文件,并在必要时枚举).

我认为
dbmaint.q
中的
copycol
功能就是您想要的。请注意,此函数不适用于嵌套列

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\u new
列。如果您有不同的情况(嵌套列或您不想复制我在示例中所示的列),则必须手动执行更新(在所有分区中重复,向下保存列,更新
.d
文件,并在必要时枚举).

根据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中,您可以根据需要拉入其他列,例如,如果您想添加两个price列:

{[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}];

根据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中,您可以根据需要拉入其他列,例如,如果您想添加两个price列:

{[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}];