こんにちは、ヤマダです。
札幌は過ごしやすい季節となってきました。油断すると風邪をひきそうです。
さて今回はQlikのExistsについてのテクニックをお伝えします。
Existsとは
ロードスクリプトのLOADの条件(Where)で使用します。
特定の項目に該当するデータをロードしたり、増分ロードでは特定項目以外(not Exists)のデータをロードする際に使用します。
公式ドキュメントはこちら
使用上で気をつけること
意図しない結果になった
Existsを使用する時点で、項目名を複数のテーブルでロードしている場合には注意が必要です。
例えば、テーブルA、テーブルBの両方で「伝票NO」の項目をリロード済の状態でExistsを使用すると、テーブルA、テーブルBの何れかに存在したデータを抽出することになります。
凡ミスなのですが、最初のころよくハマったんですよね。。スクリプトが長くなると既に同じ項目でリロード済みだったりして何でだろう、、、って、無駄な時間を使ったことが多々ありました。Existsを使う場合はどのテーブルでロードしていたか事前に確認しましょう。
Existsで使用する項目を連結している場合
定義する項目を連結して設定する場合があるかと思います。
例えばPrimaryKey=(key1 と key2の文字列連結)の場合
Where Exists(PrimaryKey, key1 & key2)
これでも問題はありませんが、件数が多い場合はリロード時間が結構かかります。
その際は、連結した項目を作成しExistsを使用することでリロード時間の短縮が見込めます。
先ほどの例で言うと、key1 と key2の文字列連結を「PrimaryKey1」として定義にロードします。
Where Exists(PrimaryKey, PrimaryKey1)
これで処理時間が早くなります。
増分ロードではパフォーマンスに注意したいところではありますので、項目をQVDにロードしておきましょう。
Existsを使用したサンプルスクリプト
Existsを使用した増分ロードのスクリプトはこんな感じになるかと思います。
order + linenoが増分用のKeyとした例になります。
(前回処理日の制御はここでは割愛します)
// 前回処理日を変数にセット
LET LastExecDate = [前回処理日];
// 追加分のデータをロード
data:
LOAD
order,
lineno,
amount,
update_date,
order & lineno as IncrementalKey //差分用のkeyをセット
FROM transaction
Where update_date >= $(LastExecDate)
;
// 過去分から追加分に存在しないデータのみリロード
Concatenate(data)
LOAD * From [data.qvd](qvd)
Where not Exists(IncrementalKey);
;
STORE data into data.qvd(qvd);
DROP Table data;
今日はこんなところになります。
ではまた!