假设我本地有一张表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函数好像只能获取所有数据,不能读取指定列,怎么办? 谢谢你的回答。
将表保存为单个二进制文件时,必须加载全部内容,无法仅加载单个列。
如果你只想加载单个列,那么你需要采取稍微不同的方法并将表展开到磁盘,以便所有列都作为单独的文件存在。
您可以通过在文件路径的末尾放置一个尾随的
/
来表示您正在保存到一个目录。
`:d:/t/ set data
然后您可以分别阅读每个相应的列,尽管它将作为列表返回。
get`:d:/t/b
"ab"
"bc"
"cd"
请注意,如果有任何符号列,则需要使用
.Q.en
枚举表格。
正如 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
的乱丢你的代码
平面文件无法深度索引——将读取整个文件。
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