Kdbplus-quick-guide
KDB +の概要
これは、kxシステムの kdb + に対する完全な手引きであり、主に独立して学習する人を対象としています。 2003年に導入されたkdb +は、データをキャプチャ、分析、比較、および保存するために設計された新世代のkdbデータベースです。
kdb +システムには、次の2つのコンポーネントが含まれています-
KDB + -データベース(kデータベースプラス)
Q -kdb +を操作するためのプログラミング言語
バックグラウンド
Kdb +/qは、あいまいなアカデミック言語として生まれましたが、長年にわたって、使いやすさが徐々に向上しています。
- APL (1964、プログラミング言語)
- A + (1988年、アーサーホイットニーによる修正APL)
- K (1993、A +の鮮明なバージョン、Aが開発) ホイットニー)
- Kdb (1998、インメモリ列ベースのデータベース)
- Kdb +/q (2003、q言語– kのより読みやすいバージョン)
KDB +を使用する理由と場所
Why? -分析機能を備えたリアルタイムデータに単一のソリューションが必要な場合は、kdb +を検討する必要があります。 Kdb +はデータベースを通常のネイティブファイルとして保存するため、ハードウェアおよびストレージアーキテクチャに関する特別なニーズはありません。 データベースは単なるファイルのセットであるため、管理作業は難しくありません。
KDB +の使用場所?-ほとんどの投資銀行が現在使用している、または従来のデータベースからkdb +に切り替える予定があるため、kdb +を使用していない投資銀行を簡単に数えます。 データの量は日々増加しているため、大量のデータを処理できるシステムが必要です。 KDB +はこの要件を満たしています。 KDB +は膨大な量のデータを保存するだけでなく、リアルタイムで分析します。
入門
ここまでの背景を踏まえて、KDB +の環境を設定する方法を説明し、学習しましょう。 KDB +をダウンロードしてインストールする方法から始めます。
KDB +のダウンロードとインストール
64ビットバージョンのすべての機能を備えた無料の32ビットバージョンのKDB +をhttp://kx.com/software-download.phpから入手できます。
ライセンス契約に同意し、オペレーティングシステムを選択します(すべての主要なオペレーティングシステムで使用可能)。 Windowsオペレーティングシステムの場合、最新バージョンは3.2です。 最新バージョンをダウンロードしてください。 解凍すると、フォルダー名*「windows」が表示され、windowsフォルダー内に別のフォルダー「q」が表示されます。 *q フォルダ全体をc:/ドライブにコピーします。
Runターミナルを開き、 q フォルダーを保存する場所を入力します。 「c:/q/w32/q.exe」のようになります。 Enterキーを押すと、次のように新しいコンソールが表示されます-
最初の行には、バージョン番号3.2とリリース日2015.03.05が表示されます。
ディレクトリレイアウト
試用版/無料版は通常、ディレクトリにインストールされますが、
- Linux/Macの場合-*
- Windowsの場合-*
サンプルファイル-
kdb +をダウンロードすると、Windowsプラットフォームのディレクトリ構造は次のように表示されます-
上記のディレクトリ構造で、 trade.q および sp.q は、参照ポイントとして使用できるサンプルファイルです。
KDB +アーキテクチャ
Kdb +は、膨大な量のデータを処理するために最初から設計された高性能で大容量のデータベースです。 完全に64ビットであり、組み込みのマルチコア処理とマルチスレッドを備えています。 同じアーキテクチャがリアルタイムデータと履歴データに使用されます。 データベースには独自の強力なクエリ言語* q、*が組み込まれているため、データに対して直接分析を実行できます。
Kdb +/tickアーキテクチャ
次の図は、一般的なKdb +/tickアーキテクチャの一般的な概要を示した後、さまざまなコンポーネントとデータのフローの簡単な説明を示しています。
- *データフィード*は、ほとんどがロイター、ブルームバーグなどのデータフィードプロバイダーによって、または取引所から直接提供される時系列データです。
- 関連データを取得するために、データフィードのデータは feed handler によって解析されます。
- フィードハンドラによってデータが解析されると、 ticker-plant に送られます。
- 障害からデータを回復するために、ティッカープラントは最初に新しいデータをログファイルに更新/保存してから、独自のテーブルを更新します。
- 内部テーブルとログファイルを更新した後、オンタイムループデータは、リアルタイムデータベースと、データを要求したすべてのチェーンサブスクライバーに継続的に送信/公開されます。
- 営業日の終わりに、ログファイルが削除され、新しいログファイルが作成され、リアルタイムデータベースが履歴データベースに保存されます。 すべてのデータが履歴データベースに保存されると、リアルタイムデータベースはそのテーブルを削除します。
Kdb + Tickアーキテクチャのコンポーネント
データフィード
データフィードには、任意の市場またはその他の時系列データを使用できます。 フィードハンドラーへの生の入力としてデータフィードを検討します。 フィードは、取引所(ライブストリーミングデータ)、トムソンロイター、ブルームバーグ、またはその他の外部機関などのニュース/データプロバイダーから直接取得できます。
フィードハンドラー
フィードハンドラーは、データストリームをkdb +への書き込みに適した形式に変換します。 データフィードに接続されており、フィード固有の形式からデータを取得して、ティッカープラントプロセスに公開されるKdb +メッセージに変換します。 一般的に、フィードハンドラは、次の操作を実行するために使用されます-
- 一連のルールに従ってデータをキャプチャします。
- そのデータをある形式から別の形式に変換(/enrich)します。 *最新の値をキャッチします。
ティッカープラント
Ticker Plantは、KDB +アーキテクチャの最も重要なコンポーネントです。 これは、リアルタイムデータベースまたは直接サブスクライバー(クライアント)が金融データにアクセスするために接続されるティッカープラントです。* publishおよびsubscribe *メカニズムで動作します。 サブスクリプション(ライセンス)を取得すると、パブリッシャー(ティッカープラント)から(定期的に)ティックパブリケーションが定義されます。 それは次の操作を実行します-
- フィードハンドラからデータを受け取ります。
- ティッカープラントはデータを受信するとすぐに、コピーをログファイルとして保存し、ティッカープラントが更新を取得したら更新します。これにより、障害が発生した場合にデータが失われることはありません。
- クライアント(リアルタイムサブスクライバー)は、ティッカープラントに直接サブスクライブできます。
- 各営業日の終わりに、つまり、リアルタイムデータベースが最後のメッセージを受信すると、今日のすべてのデータを履歴データベースに保存し、今日のデータを購読しているすべてのサブスクライバーに同じデータをプッシュします。 次に、すべてのテーブルをリセットします。 ログファイルは、履歴データベースまたはリアルタイムデータベース(rtdb)に直接リンクされている他のサブスクライバにデータが保存されると削除されます。
- その結果、ティッカープラント、リアルタイムデータベース、および履歴データベースは年中無休で稼働しています。
ticker-plantはKdb +アプリケーションであるため、他のKdb +データベースと同様に、 q を使用してテーブルをクエリできます。 すべてのティッカープラントクライアントは、サブスクライバーとしてのみデータベースにアクセスできます。
リアルタイムデータベース
リアルタイムデータベース(rdb)は、今日のデータを保存します。 ティッカープラントに直接接続されています。 通常、市場の時間(1日)にメモリに保存され、1日の終わりに履歴データベース(hdb)に書き込まれます。 データ(rdbデータ)はメモリに保存されるため、処理は非常に高速です。
kdb +では、1日あたりの予想データサイズの4倍以上のRAMサイズを推奨しているため、rdbで実行されるクエリは非常に高速で、優れたパフォーマンスを提供します。 リアルタイムデータベースには今日のデータのみが含まれるため、日付列(パラメーター)は不要です。
たとえば、次のようなrdbクエリを使用できます。
歴史的データベース
会社の推定値を計算する必要がある場合、その履歴データを利用できるようにする必要があります。 履歴データベース(hdb)は、過去に行われたトランザクションのデータを保持します。 新しい日の各レコードは、1日の終わりにhdbに追加されます。 hdbの大きなテーブルは、表示されるように保存されるか(各列が独自のファイルに保存される)、一時データによってパーティション分割されて保存されます。 また、いくつかの非常に大きなデータベースは、 par.txt (ファイル)を使用してさらにパーティション化できます。
これらのストレージ戦略(スプレイ、パーティション分割など)は、大きなテーブルからデータを検索またはアクセスする際に効率的です。
履歴データベースは、内部および外部のレポート目的、つまり分析にも使用できます。 たとえば、特定の日のIBMの企業取引を取引(または任意の)テーブル名から取得したい場合、次のようにクエリを記述する必要があります-
注- q 言語の概要がわかったら、このようなクエリをすべて作成します。
Qプログラミング言語
Kdb +には、 q として知られる組み込みプログラミング言語が付属しています。 時系列分析用に拡張された標準SQLのスーパーセットが組み込まれており、標準バージョンよりも多くの利点があります。 SQLに精通している人なら、数日のうちに q を学び、自分のアドホッククエリをすばやく書くことができます。
「q」環境の開始
kdb +の使用を開始するには、 q セッションを開始する必要があります。 q セッションを開始するには3つの方法があります-
- 実行端末で「c:/q/w32/q.exe」と入力するだけです。
- MS-DOSコマンドターミナルを起動し、 q と入力します。
- q.exe ファイルを「C:\ Windows \ System32」にコピーし、実行端末で「q」と入力します。
ここでは、Windowsプラットフォームで作業していると想定しています。
データ型
次の表は、サポートされているデータ型のリストを提供します-
Name | Example | Char | Type | Size |
---|---|---|---|---|
boolean | 1b | b | 1 | 1 |
byte | 0xff | x | 4 | 1 |
short | 23h | h | 5 | 2 |
int | 23i | i | 6 | 4 |
long | 23j | j | 7 | 8 |
real | 2.3e | e | 8 | 4 |
float | 2.3f | f | 9 | 8 |
char | “a” | c | 10 | 1 |
varchar | `ab | s | 11 | * |
month | 2003.03m | m | 13 | 4 |
date | 2015.03.17T18:01:40.134 | z | 15 | 8 |
minute | 08:31 | u | 17 | 4 |
second | 08:31:53 | v | 18 | 4 |
time | 18:03:18.521 | t | 19 | 4 |
enum | `u$`b, where u:`a`b | * | 20 | 4 |
原子とリストの形成
原子は、単一のエンティティ、たとえば、単一の数字、文字、または記号です。 (異なるデータ型の)上記の表では、サポートされているすべてのデータ型はアトムです。 リストは、一連のアトムまたはリストを含む他のタイプです。
任意の型のアトムをモナドに渡す(つまり、 単一引数関数)型関数は負の値、つまり –n を返しますが、これらのアトムの単純なリストを型関数に渡すと正の値 n を返します。
例1 –アトムとリストの形成
Q言語-型キャスト
多くの場合、一部のデータのデータ型をある型から別の型に変更する必要があります。 標準のキャスト関数は「$」* 2項演算子*です。
1つのタイプから別のタイプにキャストするために3つのアプローチが使用されます(文字列を除く)-
- シンボル名で目的のデータ型を指定します
- 文字で目的のデータ型を指定します
- 短い値で目的のデータ型を指定します。
整数から浮動小数点数へのキャスト
整数を浮動小数点数にキャストする次の例では、3つの異なるキャスト方法はすべて同等です-
3つの操作すべてが同等であるかどうかを確認し、
文字列をシンボルにキャスト
文字列をシンボルにキャストしたり、文字列をシンボルにキャストしたりする方法は少し異なります。 例で確認しましょう-
キー付き単語 `symbolまたは11hを使用して文字列を記号にキャストしようとすると、型エラーで失敗します-
文字列を非シンボルにキャストする
文字列をシンボル以外のデータ型にキャストするには、次のようにします-
したがって、文字列全体(文字のリスト)をデータ型 x の単一アトムにキャストするには、データ型 x を表す大文字を $ 演算子の最初の引数として指定する必要があります。 他の方法で x のデータ型を指定すると、文字列の各文字にキャストが適用されます。
Q言語-時間データ
Date
基準日は01Jan2000なので、kdb +の日付は整数の日数として内部的に保存されます。 この日付の後の日付は内部的に正の数として保存され、それより前の日付は負の数として参照されます。
デフォルトでは、日付は「YYYY.MM.DD」の形式で書き込まれます
- 算術および論理演算*は、日付に直接実行できます。
2000年1月1日は土曜日に落ちました。 したがって、履歴全体または将来の土曜日を7で割ると、残りは0、日曜日は1、月曜日は2になります。
タイムズ
時間は、午前0時のストロークからのミリ秒の整数として内部的に保存されます。 時間はHH:MM:SS.MSSの形式で記述されます
日付の場合のように、算術は時間に直接実行できます。
日時
日時は、ISO標準形式のように「T」で区切られた日付と時刻の組み合わせです。 日時値には、2000年1月1日午前0時からの小数日数が格納されます。
基になる端数の日数は、フロートにキャストすることで取得できます。
Q言語-リスト
リストは* q言語*の基本的な構成要素であるため、リストを完全に理解することは非常に重要です。 リストは、単純に原子(原子要素)と他のリスト(1つ以上の原子のグループ)の順序付けられたコレクションです。
リストの種類
- 一般リスト*は、一致する括弧内にその項目を囲み、それらをセミコロンで区切ります。 たとえば-
リストが同じタイプのアトムで構成されている場合、均一リスト*として知られています。 それ以外の場合、*一般リスト(混合型)として知られています。
カウント
リスト内のアイテムの数は、そのカウントから取得できます。
単純なリストの例
- 注-文字の単純なリストは文字列と呼ばれます。 *
リストには、アトムまたはリストが含まれます。* 単一のアイテムリスト*を作成するには、次を使用します-
- アトムと同等のシングルトンを区別するには、そのタイプの符号を調べます。
Q言語-インデックス作成
リストは、そのアイテムの位置によって左から右に並べられます。 リストの先頭からのアイテムのオフセットは、インデックス*と呼ばれます。 したがって、最初のアイテムにはインデックス0があり、2番目のアイテム(ある場合)にはインデックス1があります。 カウント *n のリストには、 0 から n–1 までのインデックスドメインがあります。
インデックス表記
リスト L を指定すると、インデックス i のアイテムは L [i] によってアクセスされます。 インデックスでアイテムを取得することを*アイテムインデックス作成*と呼びます。 例えば、
インデックス付き割り当て
リスト内のアイテムは、アイテムのインデックス作成によって割り当てることもできます。 したがって、
変数からのリスト
参加リスト
2つのリストで最も一般的な操作は、それらを結合してより大きなリストを作成することです。 より正確には、結合演算子(、)は、右のオペランドを左のオペランドの最後に追加し、結果を返します。 いずれかの引数でアトムを受け入れます。
ネスティング
データの複雑さは、リストをリストのアイテムとして使用して構築されます。
深さ
リストのネストのレベル数は、その深さと呼ばれます。 原子の深さは0で、単純リストの深さは1です。
これは2つの項目を持つ深さ3のリストです-
深さでのインデックス作成
ネストされたリストのアイテムに直接インデックスを付けることができます。
繰り返しアイテムのインデックス作成
単一のインデックスを介してアイテムを取得すると、常にネストされたリストから最上位のアイテムが取得されます。
結果 L [1] はそれ自体がリストであるため、単一のインデックスを使用してその要素を取得できます。
単一のインデックス作成をもう一度繰り返して、最も内側のネストされたリストからアイテムを取得できます。
これを読むことができます、
_Lからインデックス1のアイテムを取得し、インデックス2のアイテムを取得し、インデックス0のアイテムを取得します。
深さでのインデックスの表記
ネストされたリストの構成要素に繰り返しインデックスを付けるための代替表記法があります。 最後の取得は、次のように書くこともできます。
インデックスを介した割り当ても詳細に機能します。
除外インデックス
一般リストの指標の除外
- L [; 1;]を次のように解釈*
最上位の各リストの2番目の位置にあるすべてのアイテムを取得します。
- L [;; 2]を次のように解釈*
2番目のレベルの各リストの3番目の位置にあるアイテムを取得します。
Q言語-辞書
辞書は、テーブルを作成するための基盤を提供するリストの拡張です。 数学用語では、辞書は
「ドメイン→範囲」
または一般的に(短い)作成
「キー→値」
要素間の関係。
辞書は、ハッシュテーブルとほぼ同等のキーと値のペアの順序付きコレクションです。 ディクショナリは、位置対応を介したドメインリストと範囲リスト間の明示的なI/Oアソシエーションによって定義されるマッピングです。 辞書の作成には「xkey」プリミティブを使用します(!)
最も基本的な辞書は、単純なリストを単純なリストにマップします。
Input (I) | Output (O) |
---|---|
`Name | `John |
`Age | 36 |
`Sex | “M” |
Weight | 60.3 |
見上げる
入力値に対応するディクショナリ出力値を見つけることは、入力を「調べる」と呼ばれます。
動詞での検索@
辞書の操作
修正とアップサート
リストと同様に、ディクショナリのアイテムはインデックス付き割り当てを介して変更できます。
辞書は、インデックスの割り当てによって拡張できます。
検索を使用した逆引き(?)
検索(?)演算子は、要素の範囲をそのドメイン要素にマッピングすることにより、逆ルックアップを実行するために使用されます。
リストの要素が一意でない場合、 find はドメインリストから最初の項目マッピングを返します。
エントリの削除
辞書からエントリを削除するには、* delete()関数*を使用します。 ()の左側のオペランドは辞書であり、右側のオペランドはキー値です。
最初のオペランドが変数の場合、_の左側に空白が必要です。
列辞書
列辞書は、テーブル作成の基本です。 次の例を考慮してください-
辞書の反転
列ディクショナリを反転することの最終的な効果は、単にインデックスの順序を逆にすることです。 これは、行と列の転置と論理的に同等です。
列辞書の反転
辞書の転置は、単項反転演算子を適用することにより取得されます。 次の例を見てください-
反転した列辞書の反転
辞書を2回転置すると、元の辞書が取得され、
Q言語-テーブル
テーブルはkdb +の中核です。 テーブルは、辞書として実装された名前付き列のコレクションです。 * qテーブル*は列指向です。
テーブルを作成する
テーブルは、次の構文を使用して作成されます-
上記の例では、各列のタイプを指定していません。 これは、テーブルへの最初の挿入によって設定されます。
別の方法では、初期化時に列タイプを指定できます-
または、空でないテーブルを定義することもできます-
上記の例のように角括弧内に列がない場合、テーブルは unkeyed です。
- キー付きテーブル*を作成するには、角かっこにキーの列を挿入します。
また、値をさまざまなタイプのヌルリストに設定することにより、列のタイプを定義することができます-
テーブル情報の取得
貿易テーブルを作成しましょう-
主キーとキー付きテーブル
キー付きテーブル
キー付きテーブルは、一意のキーのテーブルの各行を値のテーブルの対応する行にマップする辞書です。 例を見てみましょう-
ここで、キーとしてeidを含む単純なキー付きテーブルを作成し、
ForeignKeys
- 外部キー*は、それが定義されているテーブルの行から、対応する*プライマリキー*を持つテーブルの行へのマッピングを定義します。
外部キーは*参照整合性*を提供します。 つまり、主キーにない外部キー値を挿入しようとすると失敗します。
次の例を検討してください。 最初の例では、初期化時に外部キーを明示的に定義します。 2番目の例では、2つのテーブル間の以前の関係を想定しない外部キー追跡を使用します。
例1-初期化時に外部キーを定義する
例2-テーブル間に定義済みの関係なし
外部キー追跡を使用するには、セクターにキー入力するためのテーブルを作成する必要があります。
事前定義された外部キーの一般的な表記法-
cからa.bを選択します。aは外部キー(記号)、bはa_です。
主キーテーブル(ind)のフィールド、cはthe
外部キーテーブル(取引)
テーブルの操作
1つの取引テーブルを作成し、異なるテーブル式の結果を確認しましょう-
ここで、 q 言語を使用してテーブルを操作するために使用されるステートメントを見てみましょう。
選択する
Selectステートメントの使用方法を示すために例を見てみましょう-
インサート
- 挿入*ステートメントを使用する構文は次のとおりです-
ここで、Insertステートメントの使用方法を示す例を示します-
削除する
- 削除*ステートメントを使用する構文は次のとおりです-
Deleteステートメントの使用方法を示すために例を見てみましょう-
更新
- アップデート*ステートメントを使用するための構文は次のとおりです-
次の構文を使用して、キャスト関数を使用して列の形式/データ型を更新します-
ここで、 Update ステートメントの使用方法を示す例を示します-
Q言語-動詞と副詞
Kdb +には名詞、動詞、副詞があります。 すべてのデータオブジェクトと関数は*名詞*です。 *動詞*は、式の角括弧と括弧の数を減らすことにより、読みやすくします。 *副詞*ダイアディック(2つの引数)関数と動詞を変更して、新しい関連する動詞を生成します。 副詞によって生成される関数は、*派生関数*または*派生動詞*と呼ばれます。
Each
( `)で示される副詞 each は、ダイアディック関数と動詞を変更して、リスト自体ではなくリストの項目に適用します。 次の例を見てください-
キーワード「each」を使用するモナド関数用の Each の形式があります。 例えば、
各左および各右
Q言語-結合
- 簡単な結合
- Asof Join
- 左結合
- 組合加入
ここで、この章では、これらの各結合について詳しく説明します。
単純結合
単純な結合は、カンマ「、」で実行される最も基本的な種類の結合です。 この場合、2つのテーブルは type conformant である必要があります。つまり、両方のテーブルは同じ順序で同じ列数と同じキーを持っています。
同じ長さのテーブルにカンマごとの結合を使用して、横方向に結合できます。 ここでテーブルの1つにキーを付けることができます。
Asof Join(aj)
あるテーブルのフィールドの値を別のテーブルの時点で取得するために使用される最も強力な結合です。 一般的に、各取引の時点で一般的な入札と依頼を得るために使用されます。
一般的な形式
例えば、
例
左結合(lj)
これはajの特殊なケースであり、2番目の引数はキー付きテーブルであり、1番目の引数には正しい引数のキーの列が含まれます。
一般的な形式
例
ユニオン結合(uj)
異なるスキーマを持つ2つのテーブルの結合を作成できます。 基本的には、単純な結合(、)の拡張です
キー付きテーブルでujを使用している場合、主キーは一致する必要があります。
Q言語-関数
機能の種類
関数はさまざまな方法で分類できます。 ここでは、引数の数とタイプ、および結果のタイプに基づいて分類しました。 機能は、
- Atomic -引数がアトミックであり、アトミックな結果を生成する場合
- Aggregate -リストからの原子
- 均一(リストからのリスト)-リストに適用されるアトムの概念を拡張しました。 引数リストのカウントは、結果リストのカウントと等しくなります。
- その他-関数が上記のカテゴリに属さない場合。
数学の二項演算は、qでは*ダイアディック関数*と呼ばれます。たとえば、「+」。 同様に、単項演算は*モナド関数*と呼ばれます。たとえば、「abs」または「floor」。
よく使う機能
abs
all
最大(&)、最小(|)、および非(!)
asc
avg
by
cols
カウント
port
cut
削除する
はっきりした
入隊
塗りつぶし(^)
塗りつぶし
最初
Flip
iasc
イデスク
in
インサート
key
下
最大および最小(つまり、 |および&)
null
桃
Prev
ランダム(?)
Raze
read0
read1
逆
set
ssr
ひも
SV
システム
テーブル
Til
trim
vs
xasc
xcol
xcols
xdesc
xgroup
xkey
システムコマンド
システムコマンドは q 環境を制御します。 彼らは次の形式です-
一般的なシステムコマンドのいくつかは以下で議論されています-
\ a [名前空間] –指定された名前空間のテーブルを一覧表示する
\ b –依存関係の表示
\ B –保留中のビュー/依存関係
\ cd –ディレクトリの変更
\ d –現在の名前空間を設定します
\ l – dbからファイルまたはディレクトリをロードする
\ p –ポート番号
\\-qコンソールを終了します
Q言語-組み込み関数
- 文字列関数-入力として文字列を受け取り、文字列を返します。
- 集計関数-入力としてリストを取り、アトムを返します。
- 均一関数-リストを取得し、同じカウントのリストを返します。
- 数学関数-数値引数を取り、数値引数を返します。
- その他の機能-上記以外のすべての機能。
文字列関数
Like-パターンマッチング
ltrim-先行ブランクを削除します
rtrim-末尾の空白を削除します
ss-文字列検索
trim-先頭と末尾の空白を削除します
数学関数
acos-cosの逆
cor-相関を与える
cross-デカルト積
var −分散
wavg
集約関数
すべて-および操作
任意-|操作
prd-算術積
合計-算術合計
均一関数
デルタ-前のアイテムとの違い。
fills-null値を埋めます
maxs-累積最大
その他の機能
カウント-要素の数を返す
個別-個別のエンティティを返します
例外-2番目の引数に存在しない要素。
fill-最初の引数でnullを埋める
Q言語-クエリ
- 選択式*の一般的な形式は次のとおりです-
- 注-by&where *句はオプションです。「from expression」のみが必須です。
一般的に、構文は次のようになります-
すべての句は列で実行されるため、 q は順序を利用できます。 SQLクエリは順序に基づいていないため、その利点を活用できません。
履歴データベースでは、クエリのパフォーマンスに影響するため、 where 句の順序は非常に重要です。 partition 変数(日付/月/日)が常に最初に来て、その後にソートされインデックスされた列(通常はsym列)が続きます。
例えば、
よりもずっと速い
基本クエリ
クエリスクリプトをメモ帳で作成し(以下を参照)、保存(* .q)してから読み込みます。
制約付きのクエリ
- HDBクエリを示します*
すべてのIBM取引を選択
*特定の日にすべてのIBM取引を選択します
- 100を超える価格のすべてのIBM取引を選択*
- 100以下の価格のすべてのIBM取引を選択します*
*特定の日付の午前10時30分から10時40分までのすべてのIBM取引を選択します
価格の昇順ですべてのIBM取引を選択します
*特定の時間枠で価格の降順ですべてのIBM取引を選択します
複合ソート-symで昇順をソートし、価格の降順で結果をソートします
すべてのIBMまたはMSFT取引を選択
*特定の時間枠内で昇順ですべてのシンボルのカウントを計算します
*特定の時間枠内で降順ですべてのシンボルのカウントを計算します
- 特定の期間内のIBM株の最高価格はいくらですか?
- 1時間ごとのバケットで各symの最終価格を選択します*
集計を含むクエリ
- すべてのシンボルのvwap(ボリューム加重平均価格)を計算します*
- 特定の月のレコード数(百万単位)をカウントします*
- HLOC –特定の月のCSCOの毎日の高値、安値、始値および終値*
価格範囲を1時間ごとに選択します
- 特定の月のCSCOの日次スプレッド(平均入札価格)*
- 特定の月のすべてのsymの日次取引値*
- CSCOの5分間のvwapを抽出します*
- CSCOの10分足を抽出*
- 特定の日のCSCOの最終価格に対して価格が100ベーシスポイント(100e-4)を超える時間を検索します*
- データベースの最後の日付の1分間隔でのMSFTの1日の価格とボリューム*
Q言語-プロセス間通信
KDB +では、1つのプロセスがプロセス間通信を介して別のプロセスと通信できます。 Kdb +プロセスは、同じコンピューター、同じネットワーク、またはリモートにある他のkdb +に接続できます。 ポートを指定するだけで、クライアントはそのポートと通信できます。 ネットワーク上でアクセス可能で、接続をリッスンしている限り、任意の q プロセスは他の q プロセスと通信できます。
- サーバープロセスは接続をリッスンし、リクエストを処理します
- クライアントプロセスが接続を開始し、実行するコマンドを送信します
クライアントとサーバーは、同じマシン上にあっても、異なるマシン上にあってもかまいません。 プロセスは、クライアントとサーバーの両方にすることができます。
コミュニケーションは、
- 同期(結果が返されるのを待つ)
- 非同期(待機も結果も返されません)
サーバーの初期化
通信ハンドル
通信ハンドルは、「:」で始まり、次の形式の記号です-
例
接続を開始するには、整数接続ハンドルを返す関数「hopen」を使用します。 このハンドルは、後続のすべてのクライアント要求に使用されます。 たとえば-
同期および非同期メッセージ
ハンドルを取得したら、同期的または非同期的にメッセージを送信できます。
同期メッセージ-メッセージが送信されると、待機して結果を返します。 その形式は次のとおりです-
非同期メッセージ-メッセージの送信後、待機して結果を返すことなく、すぐに次のステートメントの処理を開始します。 その形式は次のとおりです-
関数呼び出しやselectステートメントなどの応答を必要とするメッセージは、通常、同期形式を使用します。一方、テーブルに更新を挿入するなど、出力を返す必要のないメッセージは非同期になります。
Q言語-メッセージハンドラー
Kdb +プロセスには、いくつかの定義済みのメッセージハンドラがあります。 データベースを構成するには、メッセージハンドラーが重要です。 使用法のいくつかが含まれます-
- ロギング-受信メッセージをログに記録します(致命的なエラーが発生した場合に役立ちます)。
- セキュリティ-ユーザー名/IPアドレスに基づいて、データベースへのアクセス、特定の関数呼び出しなどを許可/禁止します。 許可されたサブスクライバーのみにアクセスを提供するのに役立ちます。
- *他のプロセスからの接続/切断*を処理します。
定義済みのメッセージハンドラ
定義済みのメッセージハンドラの一部については、以下で説明します。
.z.pg
同期メッセージハンドラー(プロセスget)です。 この関数は、kdb +インスタンスで同期メッセージが受信されるたびに自動的に呼び出されます。
パラメーターは、実行される文字列/関数呼び出し、つまり渡されたメッセージです。 デフォルトでは、次のように定義されています-
.z.ps
非同期メッセージハンドラー(プロセスセット)です。 非同期メッセージの同等のハンドラーです。 パラメーターは、実行される文字列/関数呼び出しです。 デフォルトでは、次のように定義されています。
以下は、保護された実行を使用した非同期メッセージ用のカスタマイズされたメッセージハンドラです。
ここで、 errhandler は、予期しないエラーが発生した場合に使用される関数です。
.z.po []
接続オープンハンドラー(プロセスオープン)です。 リモートプロセスが接続を開いたときに実行されます。 プロセスへの接続が開かれたときにハンドルを確認するには、.z.poを次のように定義します。
.z.pc []
これは、接続を閉じるハンドラーです(process-close)。 接続が閉じられたときに呼び出されます。 グローバル接続ハンドルを0にリセットし、タイマーを3秒(3000ミリ秒)ごとに起動(実行)するように設定するコマンドを発行できる独自のクローズハンドラーを作成できます。
タイマーハンドラー(.z.ts)は、接続を再度開こうとします。 成功すると、タイマーがオフになります。
.z.pi []
PIはプロセス入力を表します。 あらゆる種類の入力に対して呼び出されます。 コンソール入力またはリモートクライアント入力の処理に使用できます。 .z.pi []を使用すると、コンソール入力を検証したり、デフォルトのディスプレイを置き換えたりできます。 さらに、あらゆる種類のロギング操作に使用できます。
.z.pw
これは、検証接続ハンドラー(ユーザー認証)です。 kdb +セッションへの接続が開かれているときに、追加のコールバックを追加します。 -u/-Uチェックの後、.z.po(ポートが開く)の前に呼び出されます。
入力は userid (記号)および password (テキスト)です。
Q言語-属性
テーブルのリスト、辞書、または列には、属性を適用できます。 属性はリストに特定のプロパティを課します。 一部の属性は変更時に消える場合があります。
属性の種類
ソート済み( `s#)
`s#は、リストが昇順でソートされることを意味します。 リストがasc(またはxasc)で明示的にソートされている場合、リストにはソートされた属性が自動的に設定されます。
ソートされることがわかっているリストには、属性を明示的に設定することもできます。 Q はリストがソートされているかどうかをチェックし、ソートされていない場合は s-fail エラーがスローされます。
ソートされていない属性は、ソートされていない追加時に失われます。
別れた( `p#)
`p#は、リストが分割され、同一のアイテムが連続して保存されることを意味します。
範囲は int または temporal type で、年、月、日などの基本的なint値を持ちます。 列挙されているシンボルをパーティション分割することもできます。
parted属性を適用すると、一意の各出力値をその最初の出現位置にマップするインデックスディクショナリが作成されます。 リストが分割されると、線形検索がハッシュテーブル検索に置き換えられるため、検索がはるかに高速になります。
注-
- parted属性は、リストに対する操作の下では保持されません。 操作はパーティションを保持します。
- エンティティの数が10億に達し、パーティションのほとんどがかなりのサイズである場合、つまり、かなりの繰り返しがある場合、parted属性を考慮する必要があります。
グループ化( `g#)
`g#はリストがグループ化されていることを意味します。 内部ディクショナリが作成および維持され、一意の各アイテムが各インデックスにマップされ、かなりのストレージスペースが必要になります。 サイズ s の u 固有項目を含む長さ L のリストの場合、これは*(L×4)+(u×s)*バイトになります。
グループ化は、その構造について他の仮定ができない場合にリストに適用できます。
この属性は、入力されたリストに適用できます。 追加時には維持されますが、削除時には失われます。
ユニーク( `#u)
一意の属性( `u#)をリストに適用することは、リストのアイテムが異なることを示します。 リストの要素が一意であることを知っていると、区別*が劇的に高速化され、 *q がいくつかの比較を早期に実行できるようになります。
リストに一意のフラグが立てられると、リスト内の各アイテムに対して内部ハッシュマップが作成されます。 リストの操作は一意性を保持する必要があります。そうしないと、属性が失われます。
注-
- `u#は、一意性を保持する連結で保持されます。 削除および一意でない連結では失われます。
- `u#リストの検索は、ハッシュ関数を介して行われます。
属性を削除する
属性を削除するには、 `#を適用します。
属性を適用する
属性を適用するための3つの形式は次のとおりです-
- * L: `s#14 2 3 3 9 */リスト作成中に指定
- * @ [
。; `L; `s#]
*/機能的に適用、つまり 変数リストL +/デフォルトの名前空間(つまり、 `。)apply +/ソートされた</literal> s#属性 - *
tabから
s#timeを更新* /テーブル(タブ)を更新して、/属性を適用します。
上記の3つの異なる形式に例を適用してみましょう。
Q言語-機能クエリ
機能的(動的)クエリを使用すると、一般的なq-sqlのselect/exec/delete列のシンボルとして列名を指定できます。 列名を動的に指定する場合に非常に便利です。
機能形態は次のとおりです-
どこで
- t はテーブルです。
- a は集計の辞書です。
- b フレーズ。そして
- c は制約のリストです。
注-
- a 、 b 、および c のすべての q エンティティは、名前で参照する必要があります。これは、エンティティ名を含むシンボルとして意味します。
- selectおよびupdateの構文形式は、 q インタープリターによって同等の機能形式に解析されるため、2つの形式の間にパフォーマンスの違いはありません。
機能選択
次のコードブロックは、*機能選択*の使用方法を示しています-
例1
最も簡単なケースから始めましょう。*「select from t」*の機能バージョンは次のようになります-
例2
次の例では、enlist関数を使用してシングルトンを作成し、適切なエンティティがリストであることを確認します。
実施例3
機能実行
execの機能形式は、 select の簡略化された形式です。
機能更新
更新の機能形式は、 select の機能形式と完全に類似しています。 次の例では、enlistを使用してシングルトンを作成し、入力エンティティがリストであることを確認します。
機能削除
機能削除は、機能更新の簡略化された形式です。 その構文は次のとおりです-
機能的な削除がどのように機能するかを示すために例を見てみましょう-
Q言語-テーブル算術
この章では、辞書を操作してからテーブルを操作する方法を学びます。 辞書から始めましょう-
辞書の値を修正する必要がある場合、修正定式化することができます-
Q言語-メンテナンス機能
.Q.en
ここで、 directory は* symファイル*が配置されている履歴データベースのホームディレクトリであり、 table は列挙されるテーブルです。
テーブルを手動で列挙する必要はありません。これは、展開されたテーブルとして保存するために必要です。
.Q.dpft
- パーティションを作成するデータベースのシンボリックファイルハンドル、
- q テーブルのパーティション分割に使用するデータ値、
- parted(
p#)属性が適用されるフィールドの名前(通常は
sym) - テーブル名。
それがどのように機能するかを見てみましょう-
メモリからテーブル tab を削除しました。 次に、dbからロードします。
.Q.chk
Q.chk is a monadic function whose single parameter is the symbolic file handle of the root directory. It creates empty tables in a partition, wherever necessary, by examining each partition subdirectories in the root..
ここで、 directory は履歴データベースのホームディレクトリです。