提问人:sevenmiracle 提问时间:4/26/2023 更新时间:4/27/2023 访问量:141
kdb: 如何用以前的值填充字符串列的空值
kdb: how to fill empty values of string column with previous value
问:
我有一张这样的表格:
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
错误的内容是“长度:不兼容的列表长度”。 感谢那些可以帮助我的人。
答:
-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 不为空的位置。
我们还使用 获得非空值的实际索引。
我们可以使用布尔列表来获取索引列表,我们用它来仅从原始列表中提取所需的填充值。where
sums
评论