kdb中逐行处理表并将任意行数结果追加为新表的方法
q语言逐行处理表后合并任意行数结果的实现方法
问题描述
现有初始表定义:
t:([]a:`a`b`c;b:1 2 3;c:`x`y`z)
需要逐行迭代处理该表,单行处理逻辑可返回任意行数的结果表,所有行处理完成后需合并为统一结果表,示例期望输出如下:
results:([]a:`a1`b1`b2`b3`c1`c2;x:1 2 2 2 3 3)
原有尝试写法uj { // some processing function } each t无法正常运行。
错误原因
uj是需要接收两个表作为入参的二元全连接函数,直接搭配each使用时,不会对逐行生成的多个结果表执行合并操作,仅会将单参传入的uj单独作用在每个结果表上,逻辑不成立。
正确实现
根据单行处理函数返回表的schema一致性,选择对应写法:
- 若所有行返回的结果表列名、列类型完全一致,优先使用
raze做纵向平铺合并,写法简洁且性能最优:
/ 示例处理函数,和示例输出逻辑对齐:a值为`a返回1行,`b返回3行,`c返回2行 processRow:{[row] case[ row`a = `a; ([]a:`a1; x:row`b); row`a = `b; ([]a:`b1`b2`b3; x:3#row`b); row`a = `c; ([]a:`c1`c2; x:2#row`b) ] }; / 合并逐行结果 results: raze processRow each t
- 若不同行返回的结果表可能存在列差异(部分行返回的表存在其他行没有的列),使用
uj/(uj的over归约操作)依次做全连接合并,缺失列会自动填充对应类型的空值:
results: uj/ processRow each t
提示:
uj/的执行逻辑是对逐行返回的表列表,从左到右依次执行uj合并,即等价于(t1 uj t2) uj t3 ... uj tn。
内容的提问来源于stack exchange,提问作者delita
相关产品推荐
相关产品推荐

