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[]{ /*.... */});
Другие вопросы по тегам