【问题标题】:Compare data in two different tables in kdb比较 kdb 中两个不同表中的数据
【发布时间】:2018-09-07 19:18:53
【问题描述】:

我想比较同一张表的两个不同实例的数据。 我认为我可以比较表中的空值,但是,我不确定如何将其推广到所有表。

例如: 这是我的桌子:

a:([]a:0n 2 3;b:"a", " ","c")

我正在尝试使用下面的代码来计算所有列的空值:

{count where (null a[x]) =1b} each  cols a 

如何使用它来概括所有表格?并使用代码与远程表进行比较?

h: hopen `:2001

【问题讨论】:

    标签: kdb


    【解决方案1】:

    比较远程表中的数据可能非常棘手,这取决于很多因素,例如表大小、表是否分区等。

    假设表在内存中并且您使用空检查作为表签名,您可以在远程会话上执行此操作,然后将其与本地实例进行比较。

    /Remote service - port 2001
    q)table1:([]col1:0n 2 3 0n ;col2:"a", " ","ca")
    q)table2:([]col3:1 2 0n 4 ;col4:```b`)
    
    /local
    q)table1:([]col1:0n 2 3 0n ;col2:"a", " ","ca")
    q)table2:([]col3:1 2 0n 4 ;col4:```b`d)   //different from remote
    q)table3:([]col5:1 2 0n 4 ;col6:```b`d)    //local table
    
    q)f: { tables[]!{[t] (), {sum null x} each flip 0!value t}each tables[]}  //tables unkeyed
    
    q)remote:`::2001(f;::)
    q)remote 
    (`s#`table1`table2)!((`col1`col2)!2 1;(`col3`col4)!1 3)
    
    q)local:f[]
    q)local
    (`s#`table1`table2`table3)!((`col1`col2)!2 1;(`col3`col4)!1 2;(`col5`col6)!1 2)
    
    q)remote~'local   //only table1 signature matches
    (`table1`table2`table3)!100b
    

    【讨论】:

    • 这只会确认模式相同,而不是表中的值相同
    • f 不适用于键控表,可以修改为 value 0!t 以绕过它。
    • 感谢@ThomasSmyth 的输入,更新了代码。
    • 下周一检查。谢谢!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-23
    • 1970-01-01
    相关资源
    最近更新 更多