【问题标题】:KDB: How to assign string datatype to all columnsKDB:如何将字符串数据类型分配给所有列
【发布时间】:2018-12-05 20:24:07
【问题描述】:

当我创建表格 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

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

【问题讨论】:

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

标签: kdb


【解决方案1】:

您不能使用 as 字符串定义空表的列,因为它们只是字符列表的列表

您可以将它们设置为空列表,这就是您的代码正在执行的操作。

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

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

【讨论】:

    【解决方案2】:

    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 进程中的字符串。

    【讨论】:

      猜你喜欢
      • 2019-10-09
      • 2020-11-10
      • 2019-05-28
      • 1970-01-01
      • 1970-01-01
      • 2021-08-02
      • 2021-10-21
      • 2021-10-13
      相关资源
      最近更新 更多