有效地删除包含空值的行

Remove rows containing null values efficiently

对于包含许多行的 table,删除包含任何空值的行的最有效方法是什么?

另外,为什么会报错

ERROR: 'time (attempt to use variable time without defining/assigning first

尽管我在使用函数 select

时没有任何名称为“时间”

?[t;{(not;(null;x))} each cols t; 0b; ()]

?

中给出

你的table是在内存中还是展开在磁盘上?

如果您的table在内存中,那么简单的表格也可能是最快的。

show t:flip`a`b`c`d`e!(1+til 100)*/:100 cut 500?(1 0N)where 19 1
a  b  c  d  e
--------------
1  1     1  1
2  2  2  2  2
3  3  3  3  3
4  4  4  4  4
5  5  5  5  5
6  6  6  6  6
7  7  7  7  7
8  8  8  8  8
9  9  9  9  9
10 10 10 10 10
11 11 11 11 11
12 12 12 12 12
13    13 13 13
14 14 14 14 14
15 15 15 15 15
16 16    16 16
   17 17 17 17
18 18 18 18 18
..

q)\ts:1000 ?[t;{(not;(null;x))}each cols t;0b;()]
5 7552
q)\ts:1000 t where not any null flip t
2 6768

如果 table 在磁盘上展开,游戏就会改变。在展开的 table 中,每一列都存储为一个文件。 Select 运算符的第二个参数是约束列表;每一个解析树。而上面的 null flip t 测试了 t 的每个单元格,Select 应用的是约束 连续 :只有已经通过先前约束的行才会被测试下一个。如果没有行满足第一个 constraint/s 后续列文件可能根本不需要读取。

遵循以下规则:按限制性的降序列出您的约束 - 如果空值在某些列中更常见,请先测试它们。

关于 in-memory 测试,请注意 not any 可能比 all not 快很多,具体取决于空值是否常见。

q)q:null flip t
q)\ts:10000 all not q
9 1168
q)\ts:10000 not any q
6 656