概要
TDV で日付ごとのデータを連結する方法について説明します。
本手順では、毎日特定のフォルダにログファイルが出力されている場合を想定したデータで連結します。
データの条件
ログデータというフォルダ内 log1、log2 というフォルダが存在し、それぞれに毎日ログが出力されます。
各フォルダには2022年4月1日~2022年4月30日までのログファイルが格納されています。
ログファイルのデータは以下の通りです。
処理の流れ
1. 毎日特定のフォルダへ出力されるcsvデータのメタデータをイントロスペクトのスケジューリングでTDVへ自動追加します。
2. SQLスクリプト logs_joined でログフォルダごとに指定期間のログを連結した結果セットを出力します。
3. ビュー logs_joined_allでは、すべてのフォルダに対し、最新日時からのログ連結データをそれぞれ呼び出してこれらを連結します。
検証環境
Server Version: 8.5.2
Server OS: Windows10
Studio OS: Windows 10
データソース追加
CSVをデータソースとして登録します。
登録方法は以下の記事をご参照ください。
イントロスペクトのスケジューリング
再イントロスペクトのスケジュールを設定します。
今回のデータは1日1回追加されるデータなので、「毎日繰り返す」を選択します。
日付ファイルを連結するクエリを作成
ログを取得する日数(days
)とログの取得開始期間(from_date
)、ログフォルダ名(machine_number
)の3種類のパラメータを受け付けるSQLスクリプトを作成します。
スクリプトの記述例は以下のとおりです。
このスクリプトではプロシージャ ResourceExistsを用いて、ログファイルが存在する日付のみを連結対象としています。
プロシージャ ResourceExists については以下の記事をご参照ください。
PROCEDURE logs_joined(
IN "days" INTEGER, from_date DATE, machine_number VARCHAR(8),
OUT result CURSOR (
datetime VARCHAR(32768),
"cluster number" VARCHAR(32768),
requests VARCHAR(32768),
access VARCHAR(32768),
status VARCHAR(32768)
)
)
BEGIN
DECLARE datasource_path VARCHAR(255) DEFAULT '/shared/log/datasources/ログデータ/';
DECLARE loop_var INTEGER DEFAULT 1;
DECLARE illegal_argument_n EXCEPTION;
DECLARE to_date DATE DEFAULT from_date;
DECLARE query VARCHAR(32768);
DECLARE resource_check VARCHAR(32768);
IF "days" <= 0 THEN
RAISE illegal_argument_n;
END IF;
SET query = 'SELECT *' || ' FROM ' || datasource_path || machine_number || '/"' || TO_CHAR(from_date, 'yyyy') || '_' || TO_CHAR(from_date, 'mm') || '_' || TO_CHAR(from_date, 'dd') || '.csv"';
concat_loop:
LOOP
IF loop_var >= "days" THEN
LEAVE concat_loop;
END IF;
SET to_date = to_date - INTERVAL '1' DAY;
SET resource_check = datasource_path || machine_number || '/"' || TO_CHAR(to_date, 'yyyy') || '_' || TO_CHAR(to_date, 'mm') || '_' || TO_CHAR(to_date, 'dd') || '.csv"';
if (SELECT * FROM /lib/resource/ResourceExists(resource_check, 'TABLE', 'NULL')) Then
SET query = query || ' UNION ALL SELECT * FROM ' || datasource_path || machine_number || '/"' || TO_CHAR(to_date, 'yyyy') || '_' || TO_CHAR(to_date, 'mm') || '_' || TO_CHAR(to_date, 'dd') || '.csv"';
END IF;
SET loop_var = loop_var + 1;
END LOOP;
OPEN result FOR query;
END
実行すると以下のように3種類のパラメータを要求されることを確認します。
結果は以下のようになります。
データを連結するビューを作成
SQLスクリプト logs_joined をフォルダごとに実行し、連結するビューを作成します。
スクリプトの記述例は以下のとおりです。
ビューを実行した日付から31日前までのログを連結する設定となっています。
SELECT
tmp.datetime datetime,
tmp."cluster number" "cluster number",
tmp.requests requests,
tmp.access access,
tmp.status status
FROM ((SELECT *
FROM /shared/log/L1_physical/logs_joined(31, CURRENT_DATE, 'log1') logs_joined
UNION ALL
SELECT *
FROM /shared/log/L1_physical/logs_joined(31, CURRENT_DATE, 'log2') logs_joined)
) tmp
WHERE "cluster number" != '' or requests != '';
logs_joinedの引数を変更することで、連携を開始する日付、期間などを変更することが可能です。
例)4月30日から30日前の4月1日までのログを連結する場合
結果は以下のようになります。