kdb:如何从平面表中读取指定列名的数据

问题描述 投票:0回答:3

假设我本地有一张表t,存放在路径`d:/t中,该表有两列,形式如下:

a b   
------
0 "ab"
1 "bc"
2 "cd"

我用“set”保存在本地。

t:([]a:til 3;b:("ab";"bc";"cd"))
`:d:/t set data

我的问题是:如何从二进制文件“d:/t”中只读取 b 列。 预期结果如下:

b   
----
"ab"
"bc"
"cd"

get函数好像只能获取所有数据,不能读取指定列,怎么办? 谢谢你的回答。

file field kdb bin
3个回答
1
投票

将表保存为单个二进制文件时,必须加载全部内容,无法仅加载单个列。

如果你只想加载单个列,那么你需要采取稍微不同的方法并将表展开到磁盘,以便所有列都作为单独的文件存在。

您可以通过在文件路径的末尾放置一个尾随的

/
来表示您正在保存到一个目录。

`:d:/t/ set data

然后您可以分别阅读每个相应的列,尽管它将作为列表返回。

get`:d:/t/b
"ab"
"bc"
"cd"

请注意,如果有任何符号列,则需要使用

.Q.en
枚举表格。


1
投票

正如 Thomas 所说,如果不加载该文件的全部内容,就无法从二进制文件中加载单个列。

但是,如果您的平面文件足够小,并且您不想展开它,那么您仍然可以在查询表时指定特定的列——就好像您可以单独访问这些列一样:

q)t:([]a:til 3;b:("ab";"bc";"cd"))
q)`:test set t
q)select b from `:test
b
----
"ab"
"bc"
"cd"

别被愚弄了,这实际上是与

select b from get`:t
相同的操作,即我们仍然必须在查询期间加载整个平面文件。但这避免了用
get

乱丢你的代码

1
投票

平面文件无法深度索引——将读取整个文件。

Splayed tables 将每一列存储为一个文件以提高索引速度:

https://code.kx.com/q/kb/splayed-tables/

Anymap 文件在深度索引时也提供速度:

https://code.kx.com/q/releases/ChangesIn3.6/#anymap

q)t:flip (`$"t_",/:string til 50)!{1000000?100.0} each til 50
q)`:flat set t
q)`:splay/ set t
q)`:anymap 1: t
q)\ts select t_10 from `:flat
891 423626128
q)\ts select t_10 from `:splay
2 4196064
q)\ts select t_10 from `:anymap
0 4195424
© www.soinside.com 2019 - 2024. All rights reserved.