2015年1月2日金曜日

[kdb] splayed table for nested sym vectors

symbolのリストをsplayed tableにする場合は特殊な処理が必要らしい

こんな感じのテーブルは対象
c               | t f a
----------------| -----
sym             | s    
datetime        | z    
bidPrice        | f    
askPrice        | f    
targetTypes     | S    <-- これが問題
targetTimes     | Z    
...   
□ kxwiki - cookbook
http://code.kx.com/wiki/Cookbook/SplayedTables - Enumerating nested varchar columns in a table

□ やり方 通常は.Q.en[dbdir;data] でsymファイルが更新されるが、nested sym lists は手動でやれと書いてある。
 > .Q.en does not enumerate nested sym lists; you have to do those manually
kxwikiの例では、symファイルのディレクトリを直接書いてるので、以下のような関数を作成してみた。
enumerateSymList: {[symdir; data]
        (` sv dbdir,`sym)?raze data;
        `sym$'data
    };
// example (/db/sym に作成する場合) 
// enumerateSymList[`:/db] (data)

// こんな感じでつかう
dbdir: `:/data/kdb;
writepath: .Q.par[dbdir;2014.01.06;`$("tt","/")];
writepath set .Q.en[dbdir] update enumerateSymList[dbdir] targetTypes from tt;
writepath set .Q.en[dbdir] update enumerateSymList[dbdir] targetTypes from select from tt where (`date$datetime)=2014.01.06;
splayed tableではEnumerated Typeになるようだ。
c               | t f a
----------------| -----
sym             | s    
datetime        | z    
bidPrice        | f    
askPrice        | f    
targetTypes     |      <-- metaで表示できない
targetTimes     | Z    
...   

q) type first value first select targetTypes from tt
20h

0 件のコメント:

コメントを投稿