kdb: 如何用以前的值填充字符串列的空值

kdb: how to fill empty values of string column with previous value

提问人:sevenmiracle 提问时间:4/26/2023 更新时间:4/27/2023 访问量:141

问:

我有一张这样的表格:

t:([] c1:1 0n 3 4;c2:("abcd";"efgh";"igkl";""))
c1 c2    
---------
1  "abcd"
  "efgh"
3  "igkl"
4  ""

我想使用上一行来填充空值(包括空字符串“”),预期结果是这样的:

c1 c2    
---------
1  "abcd"
1  "efgh"
3  "igkl"
4  "igkl"

我尝试使用函数填充来执行此操作,但没有成功,

fills t

错误的内容是“长度:不兼容的列表长度”。 感谢那些可以帮助我的人。

字符串 null kdb 填充

评论


答:

-3赞 Maurice Lim 4/26/2023 #1

您可以执行以下操作:

update string fills`$c2 from t

字符串出现长度错误,因为每个字符串的长度不同。

评论

2赞 Sean O'Hagan 4/26/2023
这将破坏内存中的符号堆,在重新启动之前无法释放该堆
0赞 Maurice Lim 4/26/2023
是的,你是对的,如果桌子是一个非常大的桌子,就像在 hdb 上一样,那么你应该避免像这样将 char 投射到符号上。我试图解释使用填充的概念以及它为什么会导致错误。
2赞 Sean O'Hagan 4/26/2023 #2
q)t:([] c1:1 0n 3 4;c2:("abcd";"efgh";"igkl";""))
q)select {$[count y;y;x]}\[c2] from t
c2
------
"abcd"
"efgh"
"igkl"
"igkl"
0赞 SeanHehir 4/26/2023 #3

对于一个大表,下面的答案可能比其他答案更快(需要注意的是,它比肖恩的要占用更多的内存):

select {x (where l) -1+sums l:not x~\:""}[c2] from t
c2
------
"abcd"
"efgh"
"igkl"
"igkl"

q)t2:100000#t
q)\ts select {x (where l) -1+sums l:not x~\:""}[c2] from t2
2 3277952
q)\ts select {$[count y;y;x]}\[c2] from t2
11 1049888


这通过创建一个布尔列表来避免循环,该列表显示 x 不为空的位置。 我们还使用 获得非空值的实际索引。 我们可以使用布尔列表来获取索引列表,我们用它来仅从原始列表中提取所需的填充值。wheresums