KDB: как назначить строковый тип данных для всех столбцов - PullRequest
0 голосов
/ 05 декабря 2018

Когда я создал таблицу Tab, я указал столбцы в виде строки,

Tab: ([Key1:string()] Col1:string();Col2:string();Col3:string())

Но тип данных столбца (t) пуст.Я полагаю, что указание столбца как строки не имеет никакого эффекта.

meta Tab

c     t     f     a
--------------------
Key1            
Col1            
Col2            
Col3            

После того, как я выполню массовую загрузку в Java ...

c.Dict dict = new c.Dict((Object[]) columns.toArray(new String[columns.size()]), data);
c.Flip flip = new c.Flip(dict);

conn.c.ks("upsert", table, flip);

Все типы данных являются символами:

meta Tab

c     t     f     a
--------------------
Key1  s         
Col1  s         
Col2  s         
Col3  s

Как указать тип данных столбцов в виде строки и оставить его в виде строки?

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

KDB не позволяет определять типы столбцов в виде списка при создании таблицы.Это означает, что вы не можете определить тип столбца как String, потому что это также список.

Для этого единственный способ - определить столбец как пустой список, например:

 q) t:([]id:`int$();val:())

Тогда когдавы вставляете данные в эту таблицу, столбец автоматически принимает тип этих данных.

 q)`t insert (4;"row1")
 q) meta t
 c  | t f a
 ---| -----
 id | i    
 val| C 

В вашем случае, одним из вариантов является отправка строковых данных из вашего процесса Java, как указано пользователем 'emc211' или другим параметромпреобразовать ваши данные в строку в процессе KDB перед вставкой.

0 голосов
/ 05 декабря 2018

Вы не можете определить столбец пустой таблицы как строки, так как они представляют собой просто списки списков символов

Вы можете просто установить их как пустые списки, что и делает ваш код.

Но тогда столбец будет принимать тип данных, которые в него вставлены.

Реальный вопрос в том, как ваш Java-процесс отправляет символы, когда он должен отправлять строки.Вам нужно внести изменения перед публикацией в KDB

Обратите внимание, что если вы определили как символы, вы все равно не сможете использовать строки

q)Tab: ([Key1:`char$()] Col1:`char$();Col2:`char$();Col3:`char$())
q)Tab upsert  ([Key1:enlist"test"] Col1:enlist"test";Col2:enlist"test";Col3:enlist "test")
'rank
  [0]  Tab upsert  ([Key1:enlist"test"] Col1:enlist"test";Col2:enlist"test";Col3:enlist "test")
           ^
q)Tab: ([Key1:()] Col1:();Col2:();Col3:())
q)Tab upsert  ([Key1:enlist"test"] Col1:enlist"test";Col2:enlist"test";Col3:enlist "test")
Key1  | Col1   Col2   Col3
------| --------------------
"test"| "test" "test" "test"
...