KDB:如何在Java中批量插入?

时间:2018-11-27 22:00:36

标签: kdb

我有一个包含String列“ key1”,“ col1”,“ col2”,“ col3”的表。我下面有一个代码片段来测试批量插入。运行它时,我没有收到任何错误,但没有看到对“测试”表的任何更改。

我错过了什么吗?

        Object[][] data = new Object[4][];

        ArrayList<String>[] rec = new ArrayList[4];

        rec[0] = new ArrayList<String>();  
        rec[1] = new ArrayList<String>();  
        rec[2] = new ArrayList<String>();  
        rec[3] = new ArrayList<String>(); 

        for (Integer i = 0; i < 10; i++) {

            rec[0].add(i.toString() + i.toString() + i.toString());
            rec[1].add(i.toString() + i.toString() + i.toString());
            rec[2].add(i.toString() + i.toString() + i.toString());
            rec[3].add(i.toString() + i.toString() + i.toString());

        }

        for (int i = 0; i < 4; i++) {
            data[i] = rec[i].toArray(new Object[rec[i].size()]);
        }

        c.Dict dict = new c.Dict(Arrays.asList("key1", "col1", "col2", "col3").toArray(new String[4]), data);
        c.Flip flip = new c.Flip(dict);

        Object[] updStatement = new Object[] { ".u.upd", "test", flip };

        conn.ks(updStatement);

1 个答案:

答案 0 :(得分:2)

添加您要说的内容后,您想使用ks() method with 2 arguments

c.java class中给出的javadoc:

  

使用它来      *在kdb +中调用一个函数,该函数带有2个参数并且不返回值。例如调用f [x; y]使用ks(“ f”,x,y);      *要调用lambda,请使用ks(“ {x + y}”,x,y);

函数.u.upd接受2个参数,默认情况下,其签名与insert相同:

  • 第一个参数是表名的符号,在Java中其类型为String
  • 第二个参数是Java中类型为Object []的记录

第二个参数中Object []的长度应等于列数。 Object []中的每个Object本身都应是一个长度等于记录数的数组。内部数组的顺序应与列的顺序相同,并且每个内部数组的值应与kdb中的列类型具有matching type并与记录相同。

您的对象[]应该看起来像:

new Object[]{
    new Object[]{row1col1, row2col1, /*..., */ rowNcol1},
    new Object[]{row1col2, row2col2, /*..., */ rowNcol2},
    /* column 3 to column N-1 values */
    new Object[]{row1colN, row2colN, /*..., */ rowNcolN}
}

您的ks()方法调用应类似于:

conn.ks(".u.upd", "test", new Object[]{ /*.... */});