ストリームデータ処理基盤 uCosminexus Stream Data Platform - Application Framework アプリケーション開発ガイド

[目次][索引][前へ][次へ]

4.3.3 REGISTER QUERY_ATTRIBUTE句時刻解像度の指定

<この項の構成>
(1) 形式
(2) 機能
(3) オペランド
(4) 構文規則
(5) 注意事項
(6) 使用例

(1) 形式

REGISTER QUERY_ATTRIBUTE::=REGISTER▲QUERY_ATTRIBUTE▲<クエリ名>
                         ▲STREAM_NAME=<データ識別子>
                         ▲PERIOD=<メッシュ間隔>
                         ▲TARGETS=<集合関数1>'('<列名1>')',
                         …,<集合関数N>'('<列名N>')'

(2) 機能

クエリに時刻解像度を指定します。

(3) オペランド

<クエリ名>

この句のあとに定義する時刻解像度指定の対象となるクエリ名を,ストリームデータ処理システム内で一意になるように指定します。名称の指定については,「3.2.4 名前の指定」を参照してください。

クエリ名は,ほかのREGISTER QUERY_ATTRIBUTE句で指定する名称と重複してはいけません。また,時刻解像度指定の対象となるクエリを定義するREGISTER QUERY句では,必ずRANGEウィンドウを指定してください。

<データ識別子>

時刻解像度を指定する列名が定義されている,ストリーム名またはクエリ名を指定します。指定するストリーム名またはクエリ名は,REGISTER QUERY_ATTRIBUTE句よりも前に定義されている必要があります。

<メッシュ間隔>

メッシュ間隔をミリ秒単位で任意に指定します。必ず,単位としてmsを記述してください。

100ミリ秒未満の値は設定できません。また,時刻解像度を指定するクエリ名の句に指定されるRANGEウィンドウの間隔がメッシュ間隔を超える場合は,メッシュ間隔はRANGEウィンドウの間隔に設定されます。

例えば,メッシュ間隔が1,000ミリ秒で,RANGEウィンドウの間隔が500ミリ秒の場合,メッシュ間隔は500ミリ秒に設定されます。また,メッシュ間隔がRANGEウィンドウより小さく,かつ86,400,000ミリ秒より大きい場合は,86,400,000ミリ秒に設定されます。

なお,100ミリ秒未満の値を指定した場合は,100ミリ秒に設定されます。

<集合関数>

集合関数を指定します。ここで指定できる集合関数を次の表に示します。

表4-3 指定できる集合関数

項番 集合関数 意味
1 SUM 合計値の計算に使用します。
2 MAX 最大値の計算に使用します。
3 MIN 最小値の計算に使用します。

指定できる集合関数の個数は,1〜256個です。

<列名>

STREAM_NAMEで指定したデータ識別子が持つ列名を指定します。

列名は,重複してはいけません。

指定できる列名の個数は,1〜256個です。

(4) 構文規則

ありません。

(5) 注意事項

(6) 使用例

下線は,この例のポイントとなる個所です。

(例1)

RANGEウィンドウ内にあるタプルで,あらかじめ定義されているストリーム名stockの,列名priceの合計値を求めます。

REGISTER STREAM stock(price INTEGER, name VARCHAR(10));
REGISTER QUERY_ATTRIBUTE q1 STREAM_NAME=stock PERIOD=300ms TARGETS=SUM(price);
REGISTER QUERY q1
ISTREAM(
SELECT name, SUM (price) AS s1
FROM stock[RANGE 1 MINUTE]
GROUP BY name
);

REGISTER QUERY_ATTRIBUTE句で指定するクエリには,時刻解像度を指定するクエリq1を指定します。また,REGISTER STREAM句で定義したストリーム名stockの列名priceの合計を求めるため,データ識別子にstockを指定し,TARGETSにSUM(price)を指定します。なお,priceの合計値ではなく,最大値や最小値を求める場合には,MAX,MINを指定します。

(例2)

RANGEウィンドウ内にあるタプルで,あらかじめ定義されているストリーム名stockの,列名priceの合計値,最大値,最小値を求めます。

REGISTER STREAM stock(price INTEGER, name VARCHAR(10));
REGISTER QUERY q0
ISTREAM(
SELECT name, price AS price0, price AS price1, price AS price2
FROM stock[NOW]
);
REGISTER QUERY_ATTRIBUTE q1 STREAM_NAME=q0 PERIOD=300ms 
TARGETS=SUM(price0),MAX(price1),MIN(price2);
REGISTER QUERY q1
ISTREAM(
SELECT q0.name, SUM(q0.price0) AS sum_price,
MAX(q0.price1) AS max_price, MIN(q0.price2) AS min_price
FROM q0[RANGE 1 MINUTE]
GROUP BY q0.name
);

データ識別子stock,列名priceのクエリについて,複数の集合演算を実行する場合に,TARGETSに同一の列名priceは指定できません。例えば,「TARGETS=SUM(price), MAX(price), MIN(price)」のようには指定できません。

この場合,列名priceを合計値用,最大値用,最小値用にそれぞれ定義する必要があります。この例では,CQL文によって列名priceを置き換えた列名price0,price1,price2を持つデータ識別子(ここではq0)を定義しています。q0で定義した列名を使用してq1でそれぞれ演算を実行することで,複数の文の集合関数を実行できます。