如何在kdb

时间:2018-06-14 10:53:21

标签: kdb

当我使用meta tableName检查类型.get以下结果时:

c                t        f      a
`description     "C"

现在我想知道类型"c""C"之间的差异。以及如何将"c"类型转换为"C"

从以下说明中我可以得到,当表中有“c”类型时,我可以将其转换为“C”类型。我的新问题如下:     table1:

([ID:`1`2`3]Name:`A`B`C;Client:`P`Q`S;Species:`setosa`setosa`setosa   ;Length:2 34 6)

显示如下:

ID Name  Client    Species  Length
 1    A     B        setosa    2
 2    B     Q        setosa    34
 3    C     S        setosa    6

我想为table1写一个简单的api:

.get.table1:{[Params]
  if[Params~();Params:()!()];
   select ID:ID,NAME:Name,CLIENT:Client,SPECIES:Species,LENGTH:Length,DESCRIP:count[i]#enlist "" from table1
    }

结果:.get.table1[]

ID NAME  CLIENT    SPECIES  LENGTH  DESCRIP
 1    A     B        setosa    2       ""
 2    B     Q        setosa    34      ""
 3    C     S        setosa    6       ""

meta table1:

c             t   f   a
ID            s
NAME          s
CLIENT        s
LENGTH        j
DESCRIP       C

现在,我想改变api的写作风格,以获得与上面api相同的结果。我该怎么办?(如何描述DESCRIP行)

.get.table1:{[Params]
   if[Params~();Params:()!()];
   defaultCols:`ID`NAME`CLIENT`SPECIES`LENGTH`DESCRIP!(`ID;`Name;`Client;`Species`;`Length;**DESCRIP**)
   if[`extraCols in key Params;
   extraCols:$[-11h=type Params`extraCols;enlist[Params`extraCols]!enlist 
Params`extraCols;(Params`extraCols)!Params`extraCols];
defaultCols:defaultCols,extraCols];
?[select from table1;();0b;defaultCols]

}

3 个答案:

答案 0 :(得分:6)

类型“c”表示列中的每个元素都是原子,而类型“C”表示列中的每个元素都是该类型的列表。要将“c”转换为“C”,您可以将每个字符添加到列表中。

q) meta ([] c:"123")
c| t f a
-| -----
c| c

q) meta ([] c:enlist each "123")
c| t f a
-| -----
c| C

查询字符串列效率低下。如果您的列具有一组经常重复的不同值,则将列转换为符号列将更有效

答案 1 :(得分:2)

类型“c”是单个字符(原子)。类型“C”是字符列表。以下是一些可能有助于演示的示例:

q)tbl:([] col:"abc")
q)meta tbl
c  | t f a
---| -----
col| c    
q)tbl
col
---
a  
b  
c  
q)update col:enlist each col from `tbl / "cast"
`tbl
q)meta tbl
c  | t f a
---| -----
col| C    
q)tbl
col 
----
,"a"
,"b"
,"c"

所以“演员”只是一个征集者。如果列与原子和列表混合,请小心,因为“每个列出”不会给你你想要的东西。你必须有条件地只使用这样的东西来招募那些只是原子的值。

q)enl:{$[0h>type x;enlist x;x]}
q)update col:enl each col from `tbl

答案 2 :(得分:2)

还有一种方法:

q)t:([] x:"abc")
q)meta update ("",/:x) from t
c| t f a
-| -----
x| C

附加空字符串的好处是,如果元素已经是列表,它将不会产生任何影响

q)t:([] x:"",/:"abc")     / each element is already a list 
meta[t]~meta update ("",/:x) from t

但是,应用enlist会将数据类型更改为异构列表(type 0h):

q)t:([] x:"",/:"abc")
q)meta update enlist each x from t
c| t f a
-| -----
x|