【问题标题】:column values change between loading two partioned tables in KDB (q)在 KDB 中加载两个分区表时列值发生变化 (q)
【发布时间】:2020-07-01 20:33:47
【问题描述】:

我在磁盘上有两个分区的 kdb 表(一个称为交易,一个称为书籍)。我创建了数据 使用

.Q.dpft[`:I:/check/trades/;2020.01.01;`symTrade;`trades]

.Q.dpft[`:I:/check/books/;2020.01.01;`sym;`books]

每天。如果我从交易表中选择数据,然后加载书籍表(不选择数据),我的结果的 symTrade 列中的值将更改为新值。我认为这与将书籍表中的分区应用于交易表的结果有关(在加载书籍表后,交易表也不再可访问)。

我该怎么做:

  • 在加载书籍表后保持交易表可访问?
  • 避免我的 symTrade 列被 sym 值覆盖 书桌?

这是一个例子:

system "l I:/check/trades/";
test: 10 sublist select from trades where date=2020.01.01;
show cols test;
// gives `date`symTrade`time`Price`Qty`Volume
select distinct symTrade from test;
// gives TICKER1
// now loading another table
system "l I:/check/books";
select distinct symTrade from test;
// now gives a different value e.g. TICKER200

【问题讨论】:

    标签: kdb database-partitioning data-partitioning


    【解决方案1】:

    我认为问题在于您将这些表保存到两个不同的数据库中。

    .Q.dpft 中的第一个参数是数据库根目录的路径,第四个参数是要存储的表的名称。所以当你这样做时

    .Q.dpft[`:I:/check/trades/;2020.01.01;`symTrade;`trades]
    

    您将交易表存储在 I:/check/trades 的数据库中以及何时进行

    .Q.dpft[`:I:/check/books/;2020.01.01;`sym;`books]
    

    您将 books 表存储在 I:/check/books 的数据库中。我认为 q 一次只能加载一个数据库,所以这可能是问题所在。

    尝试这样做

    .Q.dpft[`:I:/check/;2020.01.01;`symTrade;`trades]
    .Q.dpft[`:I:/check/;2020.01.01;`sym;`books]
    system "l I:/check/";
    

    让我们知道这是否有效!

    【讨论】:

    • 补充一下,您在符号列中的值更改的原因是由于符号文件。 .Q.dpft 将针对存储在 HDB 根目录中的 sym 文件枚举所有符号值。加载数据库时,sym 文件会加载到内存中。当您加载第二个数据库时,您正在用新的 sym 文件覆盖当前的 sym 文件,因此加载的第一个表中的符号列被映射到错误的 sym 文件,因此显示不正确的值。要么将表存储在同一个数据库中,要么将数据库加载到不同的进程中,要么不枚举第一个表。
    猜你喜欢
    • 2022-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多