KDB: как сделать массовую вставку в Java? - PullRequest
0 голосов
/ 28 ноября 2018

У меня есть таблица со строковыми столбцами «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 голосов
/ 28 ноября 2018

Добавляя к тому, что вы сказали, вы хотите использовать метод 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[]{ /*.... */});
...