【问题标题】:KDB\Q: How to run an iterative union join from within a ticker function?KDB\Q:如何从一个ticker 函数中运行一个迭代联合连接?
【发布时间】:2019-09-03 02:58:17
【问题描述】:

我正在尝试根据 kdb 刻度体系结构从刻度函数内对表运行迭代联合联接,如下所示:

table1:([]time:`timespan$();sym:`symbol$();var1:`float$());

if[not system"t";system"t 1000";
    .z.ts:{
        table2: ...
        table1:table1 uj table2 / throws non descriptive error
        `table1 uj table2 / throws type error
    }

非描述性错误:

'table1
[0] ()

我正在尝试维护一个本地表,该表保留最后 500 行左右(带有动态列),以便运行进一步处理。 但是我似乎无法从 tick 函数中更新表格。 应该如何实现这一功能? 谢谢

【问题讨论】:

  • 这不是和你问的其他问题一样吗?您的代码 sn-p 中存在一些问题: 1. 您是尝试两次联合加入,还是只是为了显示目的而这样做? 2. 您的语句末尾是否没有分号,或者您是否再次出于显示目的不显示它们? 3. union join uj不能按名称引用表,必须按值引用表。换句话说,你不能在表名前面有一个反引号,你必须使用table1:table1 uj table2; 并注意这会创建一个本地表而不是全局表。

标签: kdb


【解决方案1】:

您收到 'table1 作为错误,因为它没有在 .z.ts 中本地定义。在 kdb 中,如果对函数内的特定变量进行本地分配,则 kdb 在函数内本地引用该变量。在table1 的示例中,您在.z.ts 中本地分配它,然后尝试引用您在.z.ts 之外全局分配的table1。要解决您的问题,您必须在.z.ts 中全局分配table1,就像table1::table1 uj table2 一样。

table1:([]time:`timespan$();sym:`symbol$();var1:`float$());

if[not system"t";system"t 1000";
    .z.ts:{
        table2: ...
        table1::table1 uj table2

【讨论】:

    【解决方案2】:

    一般来说,

    如果返回的信号不是basic errors 之一,那么这是由于范围界定

    这假设您没有从给定列表中提供变量名称,因此这是最佳实践。如果您遵循这种做法,您就会知道如果返回变量名称,那是由于范围问题。

    Re:作用域,kdb 不具备词法作用域,有关 kdb 作用域的更多详细信息可以在herehere 中找到。然而,正如 Matt 所详述的,这是由于 kdb 解析器在本地/全局混合分配中发生冲突

    【讨论】:

      猜你喜欢
      • 2021-12-23
      • 1970-01-01
      • 2020-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-26
      相关资源
      最近更新 更多