データ加工とは、生データをクレンジング、変換、統合、集計などの処理を施し、分析、アプリケーション、または表示に適した形式にするプロセスです。OceanBaseのAP / データウェアハウスシナリオでは、一般的な加工パスは大きく三つに分類できます。
- SQL / PL:テナント内でSQLを用いて変換とデータ投入を行い、非同期ジョブや定期タスクなどのオーケストレーションにより実行します。
- マテリアライズドビュー:繰り返し計算される結果を更新可能なマテリアライズドビューとして蓄積し、増分/リアルタイム処理やクエリのリライトによってオンライン分析コストを削減します。
- 外部計算(Flinkなど):Flink、DataWorks、dbtなどの外部エンジンでストリーム処理やバッチ処理、モデリングを行い、その後OceanBaseに同期または書き込みます。
SQL/PLによるデータベース内でのバッチ処理とタスクスケジューリング
SQL(およびOracleモードのPLパッケージ)を直接使用して、データベース内でバッチ書き込み、上書き、定期的なスケジュール処理を実行します。これは、リンクが短く、計算をデータに近づけたいシナリオに適しています。
INSERT OVERWRITE SELECT 操作
INSERT OVERWRITE SELECT は、クエリ結果をターゲットテーブルに挿入する操作であり、同時にターゲットテーブルの既存データを上書きします。主にデータクレンジングや変換プロセスで使用され、処理後のデータを効率的に一括してデータベースに挿入できます。この操作は原子性を保証しており、実行中に例外が発生した場合、操作全体がロールバックされます。
適用シナリオ
- データを一括インポートし、ターゲットテーブルを上書きする必要がある場合、
INSERT OVERWRITE 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';
ジョブには通常、データの抽出、変換、ロードなど、複数のステップが含まれており、データ処理プロセス全体の自動化された実行を実現します。
構文と動作の詳細については、SUBMIT JOB(MySQLモード)を参照してください。
スケジュールタスク
スケジュールタスクは、設定されたスケジュールに従って指定されたジョブを定期的に実行するために使用されます。スケジュールタスクにより、データ処理の自動化が可能となり、人為的なメンテナンスコストを削減できます。
適用シナリオ
- 期限切れデータの定期的なクリーンアップ、レポートの生成、データの同期など。
- 特定の時間や周期的なタスクでのデータ処理ジョブの自動実行。
スケジュールタスク作成例
- 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';
マテリアライズドビュー:事前計算、更新、クエリのリライト
マテリアライズドビューを使用して、ワイドテーブル、集計、複数テーブルの結合などの結果をマテリアライズし、フル/増分/リアルタイム戦略で更新することができます。これにより、カラムストア形式とクエリのリライトを組み合わせて、詳細テーブル上の重複スキャンと集計を軽減できます。
- マテリアライズドビューによるクエリの高速化:
sales/itemsを通じた一連のサンプル(フル、増分、リアルタイム、ネスト、カラムストア、クエリのリライト、インデックスなど)。 - マテリアライズドビューの概要(MySQL)、マテリアライズドビューの概要(Oracle):概念、構文、ディクショナリビューなどのリファレンスマニュアルに記載されている説明。
- マテリアライズドビューの典型的なユースケースと実践:注文テーブル、
tbl*、外部テーブルなどの段階的なSQL実践。
外部計算(Flinkなど):エコシステムとストリーム・バッチの統合
複雑なストリーム処理、システム間ETL、またはクラウドベンダーが管理するパイプラインは、通常 OceanBase外部の計算エンジン(例:Flink、DataWorks、dbt、AWS Glueなど)で実行され、その後同期またはロードを通じてOceanBaseと連携します。
ツールの選定、Flink CDCの接続、ODCに関する説明は、データ加工ツール を参照してください。
関連ドキュメント
- データ加工ツール(Flink、dbt、DataWorks、AWS Glue、ODCなど)
- マテリアライズドビューによるクエリの高速化、マテリアライズドビューの典型的なユースケースと実践、マテリアライズドビューの概要(MySQL)、マテリアライズドビューの概要(Oracle)