データ加工とは、生データを特定の分析、アプリケーション、または表示に適した形式にするために、一連の処理と変換を施すプロセスです。通常、データクレンジング、データ変換、データ統合、データ集計、データエンリッチメント、データフィルタリング、データアノテーションなどの操作を含み、元の乱雑なデータを構造化された高品質で使いやすいデータセットに変換します。これにより、よりシンプルで高性能なクエリ分析機能を提供する基盤が築かれます。
効率的なデータ加工タスクの実行は、高性能な生データの読み取り、豊富な関数、効率的なクエリ分析、高性能なデータ書き込み能力に依存するだけでなく、業務特性に合致した周辺機能にも依存します。
本記事では、OceanBaseがデータ加工業務にどのように貢献するか、その特徴を重点的に紹介します。
INSERT OVERWRITER SELECT 操作
INSERT OVERWRITER SELECT は、クエリ結果をターゲットテーブルに挿入する操作であり、同時にターゲットテーブルの既存データを上書きします。主にデータクレンジングや変換のプロセスで使用され、加工後のデータを効率的にバッチ挿入することができます。この操作は原子性を保証しており、実行中に例外が発生した場合、操作全体がロールバックされます。
適用シナリオ
- データを一括インポートし、ターゲットテーブルを上書きする必要がある場合、
INSERT OVERWRITER SELECTは簡便な方法を提供します。 - データクレンジング時にターゲットテーブルに既存データがあり、新しいデータで古いデータを置き換えたい場合に適しています。
- ソーステーブルはデータベースの内部テーブルでも外部テーブルでもかまいません。
構文例
INSERT [/*+PARALLEL(N)*/] OVERWRITE table_name [(list_of_columns)] [PARTITION (partition_name, ...)] select_stmt;
注意事項
- この操作はターゲットテーブルまたはパーティション内のすべてのデータを削除するため、使用には慎重にしてください。誤操作を防ぐため、事前にデータのバックアップを確実に行ってください。
- データ挿入失敗を避けるため、
SELECTクエリが返すデータ形式がターゲットテーブルの構造と一致していることを確認してください。 - INSERT INTO SELECT と INSERT OVERWRITE SELECT の違いは、INSERT INTO SELECT はターゲットテーブルやパーティションに挿入前のデータクリアを行わず、加工後のデータを増分書き込む点です。
INSERT OVERWRITE SELECTとリアルタイム書き込み方式(INSERT INTO、REPLACE INTO、DELETE、UPDATE)を同時に使用して同一テーブルにデータを書き込むことはしないでください。そうすると、リアルタイムで書き込まれたデータが破棄されます。
詳細な操作上の注意点については、MySQLモードでINSERT OVERWRITE SELECTステートメントを使用してデータを挿入するおよびOracleモードでINSERT OVERWRITE SELECTステートメントを使用してデータを挿入するをご参照ください。
ジョブの提出 (Submit Job)
OceanBaseデータベースでは、ジョブ提出機能により、ユーザーは複雑なデータ加工タスクを提出して実行できます。これらのタスクには、データバッチ処理、ETL(抽出・変換・ロード)ジョブ、その他のバックグラウンドデータ処理作業が含まれます。INSERT INTO または INSERT OVERWRITE SELECT を使用してデータをインポートする場合、デフォルトでは同期実行プロセスとなります。データ量が多い場合、セッションを長時間アクティブ状態に保つ必要が生じる可能性があります。そのため、データ量が多いシナリオでは、非同期方式でデータインポートタスクを提出することを推奨します。
適用シナリオ
- バッチデータインポート、データクレンジング、レポート生成などの複雑なデータ処理操作を定期的に実行する場合。
- 大規模なデータ移行または変換タスクのスケジューリング。
ジョブ提出の例
-- ジョブの送信
SUBMIT JOB INSERT OVERWRITE test
SELECT ex1.c1,t2.c2,sum(ex1.c3)
FROM ex1,t2
WHERE ex1.id = t2.id
GROUP BY ex1.c1,t2,c2;
-- 非同期タスクの状態を確認する
SHOW JOB STATUS WHERE job='job_id';
ジョブには通常、データの抽出、変換、ロードなど、複数のステップが含まれます。これにより、データ処理の全プロセスを自動化して実行できます。
スケジュールタスク
スケジュールタスクは、設定されたスケジュールに従って指定したジョブを定期的に実行するために使用されます。スケジュールタスクを利用することで、データ処理の流れを自動化し、人為的なメンテナンスコストを削減できます。
適用シナリオ
- 期限切れデータの定期的なクリーンアップ、レポートの生成、データの同期など。
- 特定の時間や周期的なタスクで、データ処理ジョブを自動実行する場合。
スケジュールタスク作成例
- MySQLモード:
Event Schedulerコマンドを使用してスケジュールタスクを作成します。
-- スケジュールタスクの作成
CREATE EVENT myevent
ON SCHEDULE AT '2024-12-26 00:00:00' + INTERVAL 1 DAY
DO
INSERT INTO test SELECT * FROM ex_test WHERE date_key = curdate();
-- スケジュールタスクの確認
SELECT * FROM information_schema.events WHERE event_name='myevent';
- Oracleモード:
DBMS_SCHEDULERシステムパッケージを使用してスケジュールタスクを作成します。
-- スケジュールタスクの作成
BEGIN
DBMS_SCHEDULER.CREATE_JOB(
job_name => 'myscheduler', -- ジョブ名
job_type => 'STORED_PROCEDURE', -- ジョブタイプはストアドプロシージャ
job_action => 'data_cleaning', -- ジョブで実行するストアドプロシージャ
number_of_argument => 0, -- パラメータは不要
start_date => SYSDATE, -- ジョブ開始時刻
repeat_interval => 'FREQ=DAILY; INTERVAL=1', -- 毎日1回実行
end_date => NULL, -- 終了時刻を設定しない場合、ジョブは継続的に実行されます
job_class => 'DEFAULT_JOB_CLASS', -- ジョブカテゴリはデフォルト
enabled => TRUE, -- ジョブを有効化
auto_drop => TRUE, -- ジョブ完了後に自動的に削除
comments => '毎日定期的にデータをクリーニングおよび変換します', -- ジョブコメント
credential_name => NULL, -- 資格証明なし
destination_name => NULL, -- 対象データベースなし
max_run_duration => 0 -- 最大実行時間の制限なし
);
COMMIT;
END;
/
-- スケジュールタスクの確認
SELECT * FROM DBA_SCHEDULER_JOBS WHERE job_name = 'myscheduler';
SELECT * from DBA_SCHEDULER_JOB_RUN_DETAILS WHERE job_name ='myscheduler';