KDB:如何在 Java 中进行批量插入?
KDB: how do I do bulk insert in Java?
我有一个 table,其中包含字符串列 "key1"、"col1"、"col2"、"col3"。我在下面有一个片段来测试批量插入。当我 运行 它时,我没有收到任何错误,但我没有看到 "test" table.
有任何变化
我是不是漏掉了什么?
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);
加上你所说的,你想使用 ks() method with 2 arguments。
来自 c.java class 中给出的 javadoc:
Use this to
* invoke a function in kdb+ which takes 2 arguments and does not return a value. e.g. to invoke f[x;y] use ks("f",x,y);
* to invoke a lambda, use ks("{x+y}",x,y);
函数 .u.upd
接受 2 个参数,默认情况下,与 insert:
具有相同的签名
- 第一个参数是 table 名称的符号,其类型为 Java
- 第二个参数是 Java
中 Object[] 类型的记录
第二个参数中Object[]的长度应该等于列数。 Object[] 中的每个 Object 本身应该是一个长度等于记录数的数组。内部数组的顺序应与列的顺序相同,并且每个内部数组的值应具有 matching type 到 kdb 中的列类型并且与记录具有相同的顺序。
您的对象[] 应如下所示:
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[]{ /*.... */});
我有一个 table,其中包含字符串列 "key1"、"col1"、"col2"、"col3"。我在下面有一个片段来测试批量插入。当我 运行 它时,我没有收到任何错误,但我没有看到 "test" table.
有任何变化我是不是漏掉了什么?
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);
加上你所说的,你想使用 ks() method with 2 arguments。
来自 c.java class 中给出的 javadoc:
Use this to * invoke a function in kdb+ which takes 2 arguments and does not return a value. e.g. to invoke f[x;y] use ks("f",x,y); * to invoke a lambda, use ks("{x+y}",x,y);
函数 .u.upd
接受 2 个参数,默认情况下,与 insert:
- 第一个参数是 table 名称的符号,其类型为 Java
- 第二个参数是 Java 中 Object[] 类型的记录
第二个参数中Object[]的长度应该等于列数。 Object[] 中的每个 Object 本身应该是一个长度等于记录数的数组。内部数组的顺序应与列的顺序相同,并且每个内部数组的值应具有 matching type 到 kdb 中的列类型并且与记录具有相同的顺序。
您的对象[] 应如下所示:
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[]{ /*.... */});