KDB: как сделать массовую вставку в Java?
У меня есть таблица со строковыми столбцами "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 ответ
Добавляя к тому, что вы сказали, вы хотите использовать метод ks() с 2 аргументами.
Из javadoc, указанного в классе c.java:
Используйте это, чтобы * вызвать функцию в kdb+, которая принимает 2 аргумента и не возвращает значение. например, чтобы вызвать f[x;y], используйте ks("f",x,y); * чтобы вызвать лямбду, используйте ks("{x+y}",x,y);
Функция .u.upd
принимает 2 аргумента и, по умолчанию, имеет ту же подпись, что и insert:
- Первый аргумент - это символ для имени таблицы, который имеет тип String в Java
- Второй аргумент - это записи, которые имеют тип Object[] в Java
Длина объекта [] во втором аргументе должна быть равна количеству столбцов. Каждый объект в Object[] должен быть массивом, длина которого равна числу записей. Порядок внутренних массивов должен быть таким же, как столбцы, а значения каждого внутреннего массива должны соответствовать типу столбца в 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[]{ /*.... */});