kdb/q:用hopen查询多个句柄

kdb/q: Query multiple handles with hopen

我希望能够一次查询多个句柄,其中 table 具有相同的格式,例如:

句柄数:8000,8001,8003 tables: foo

想做类似的事情:

x:hopen `8000`8001`8003
x select from foo col1,col2

所以我从每个句柄上的每个 foo table 中获取行。

有办法实现吗?

谢谢

使用'each'希望每个句柄

  q)h:hopen each 8000 8001 8002
  q)h
  476 480 484i

使用 apply each-left 向每个服务器发送相同的查询

  q)r:h@\:"select col1,col2 from foo"
  q)r
  +`col1`col2!(1 2;2 3)
  +`col1`col2!(1 2;2 3)
  +`col1`col2!(1 2;2 3)

那你就得把结果夷为平地了:

 q)show res:raze r
col1 col2
--------- 
 1    2
 2    3
 1    2
 2    3
 1    2
 2    3

如果您不打算重复使用句柄,可以这样做

q)raze`::8000`::8001`::8003@\:"select from foo col1,col2"

与其他答案相同,但使用 set (neg h) 而不是 get (h) 更复杂

cookbook/load-balancing 在此示例中也有帮助。

q)h:hopen each 8000 8001 8002
q)h
476 480 484i
q)r:(0#0i)!()               /dictionary of handles and results

设置服务器响应的回调

q).z.ps:{@[`r;.z.w;:;x]}

向每个句柄发送 "set" 查询

q)(neg h)@\:({(neg .z.w)value"select col1,col2 from foo"};`)

等到所有消息都有回复

q)h .\:()

最后,把结果放在一起

q)raze r h

唯一的优势是并发。

正如@AlexanderBelopolsky指出的,不要忘记

q)hclose each h