KDB:如何为所有列分配字符串数据类型

KDB:如何为所有列分配字符串数据类型,kdb,Kdb,创建表选项卡时,我将列指定为字符串 Tab: ([Key1:string()] Col1:string();Col2:string();Col3:string()) 但列数据类型(t)为空。我认为将列指定为字符串没有效果 meta Tab c t f a -------------------- Key1 Col1 Col2 Col3 在我用Java进行批量升级后 c.D

创建表选项卡时,我将列指定为字符串

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

如何将列的数据类型指定为string并保持为string?

不能将空表中的列定义为string,因为它们只是字符列表

您可以将它们设置为空列表,这就是您的代码所做的

但该列随后将采用插入其中的任何数据的类型

真正的问题是,当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"

不能将空表的列定义为字符串,因为它们只是字符列表的列表

您可以将它们设置为空列表,这就是您的代码所做的

但该列随后将采用插入其中的任何数据的类型

真正的问题是,当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"

KDB不允许在创建表期间将列类型定义为列表。这意味着您不能将列类型定义为字符串,因为这也是一个列表

要做到这一点,唯一的方法是将列定义为空列表,如:

 q) t:([]id:`int$();val:())
然后,当您向该表中插入数据时,该列将自动采用该数据的类型

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

在您的情况下,一个选项是从Java进程发送用户“emc211”提到的字符串数据,或者另一个选项是在插入之前将数据转换为KDB进程中的字符串。

KDB不允许在创建表期间将列类型定义为列表。这意味着您不能将列类型定义为字符串,因为这也是一个列表

要做到这一点,唯一的方法是将列定义为空列表,如:

 q) t:([]id:`int$();val:())
然后,当您向该表中插入数据时,该列将自动采用该数据的类型

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

在您的情况下,一个选项是从Java进程发送字符串数据,如用户“emc211”所述,或者另一个选项是在插入之前将数据转换为KDB进程中的字符串。

string
不是类型,而是函数,它将其他类型强制转换为Q的字符数组
string
不是类型,而是函数,它将其他类型强制转换为Q的字符数组