需要说明 kdb/q 保存分区的脚本 table
Need to explain the kdb/q script to save partitioned table
我试图从以下来源理解这段代码:
https://code.kx.com/q/kb/loading-from-large-files/
自己定制(e.x按小时、分钟、滴答数等划分):
$ cat fs.q
\d .Q
/ extension of .Q.dpft to separate table name & data
/ and allow append or overwrite
/ pass table data in t, table name in n, : or , in g
k)dpfgnt:{[d;p;f;g;n;t]if[~&/qm'r:+en[d]t;'`unmappable];
{[d;g;t;i;x]@[d;x;g;t[x]i]}[d:par[d;p;n];g;r;<r f]'!r;
@[;f;`p#]@[d;`.d;:;f,r@&~f=r:!r];n}
/ generalization of .Q.dpfnt to auto-partition and save a multi-partition table
/ pass table data in t, table name in n, name of column to partition on in c
k)dcfgnt:{[d;c;f;g;n;t]*p dpfgnt[d;;f;g;n]'?[t;;0b;()]',:'(=;c;)'p:?[;();();c]?[t;();1b;(,c)!,c]}
\d .
r:flip`date`open`high`low`close`volume`sym!("DFFFFIS";",")0:
w:.Q.dcfgnt[`:db;`date;`sym;,;`stats]
.Q.fs[w r@]`:file.csv
但是我找不到任何资源来给我详细解释。例如:
if[~&/qm'r:+en[d]t;'`unmappable];
参数d
有什么作用?
(将其提升为答案,因为我认为它有助于回答问题)。
根据评论链:为了将 k 代码翻译成 q 代码(或者只是为了理解 k 代码),您有几个选择,none 其中有特别详细的记录违背了 q 语言的目的——成为掩盖 k 语言的包装器。
选项 1 是检查 .q 命名空间中的内置函数
q).q
| ::
neg | -:
not | ~:
null | ^:
string | $:
reciprocal| %:
floor | _:
...
选项 2 是检查创建上述命名空间的 q.k 脚本(注意不要 edit/change 这个):
vi $QHOME/q.k
选项 3 是在 code.kx 网站上查找一些重要的文档,例如 https://code.kx.com/q/wp/parse-trees/#k4-q-and-qk and https://code.kx.com/q/basics/exposed-infrastructure/#unary-forms
选项 4 是 google 为 k 的 other/similar 版本搜索参考 material,例如 k2/k3。他们往往是相似的。
最后要注意的一点是,在大多数这些示例中,您会在原语之后看到一个冒号 (:)...此冒号在 q/kdb 中是必需的,以使用原语的单子形式(大多数都严重超载)而在 k 中不需要显式强制 monadic 形式。这就是为什么 where
在 q 参考中显示为 &:
但在实际 k 代码中通常只是 &
我试图从以下来源理解这段代码:
https://code.kx.com/q/kb/loading-from-large-files/
自己定制(e.x按小时、分钟、滴答数等划分):
$ cat fs.q
\d .Q
/ extension of .Q.dpft to separate table name & data
/ and allow append or overwrite
/ pass table data in t, table name in n, : or , in g
k)dpfgnt:{[d;p;f;g;n;t]if[~&/qm'r:+en[d]t;'`unmappable];
{[d;g;t;i;x]@[d;x;g;t[x]i]}[d:par[d;p;n];g;r;<r f]'!r;
@[;f;`p#]@[d;`.d;:;f,r@&~f=r:!r];n}
/ generalization of .Q.dpfnt to auto-partition and save a multi-partition table
/ pass table data in t, table name in n, name of column to partition on in c
k)dcfgnt:{[d;c;f;g;n;t]*p dpfgnt[d;;f;g;n]'?[t;;0b;()]',:'(=;c;)'p:?[;();();c]?[t;();1b;(,c)!,c]}
\d .
r:flip`date`open`high`low`close`volume`sym!("DFFFFIS";",")0:
w:.Q.dcfgnt[`:db;`date;`sym;,;`stats]
.Q.fs[w r@]`:file.csv
但是我找不到任何资源来给我详细解释。例如:
if[~&/qm'r:+en[d]t;'`unmappable];
参数d
有什么作用?
(将其提升为答案,因为我认为它有助于回答问题)。
根据评论链:为了将 k 代码翻译成 q 代码(或者只是为了理解 k 代码),您有几个选择,none 其中有特别详细的记录违背了 q 语言的目的——成为掩盖 k 语言的包装器。
选项 1 是检查 .q 命名空间中的内置函数
q).q
| ::
neg | -:
not | ~:
null | ^:
string | $:
reciprocal| %:
floor | _:
...
选项 2 是检查创建上述命名空间的 q.k 脚本(注意不要 edit/change 这个):
vi $QHOME/q.k
选项 3 是在 code.kx 网站上查找一些重要的文档,例如 https://code.kx.com/q/wp/parse-trees/#k4-q-and-qk and https://code.kx.com/q/basics/exposed-infrastructure/#unary-forms
选项 4 是 google 为 k 的 other/similar 版本搜索参考 material,例如 k2/k3。他们往往是相似的。
最后要注意的一点是,在大多数这些示例中,您会在原语之后看到一个冒号 (:)...此冒号在 q/kdb 中是必需的,以使用原语的单子形式(大多数都严重超载)而在 k 中不需要显式强制 monadic 形式。这就是为什么 where
在 q 参考中显示为 &:
但在实际 k 代码中通常只是 &