通常、データベース内のテーブルデータはデータベースのストレージ領域に格納されますが、外部テーブルのデータは外部ストレージサービスに保存されます。OceanBase データベースは外部テーブル機能を導入しており、ユーザーは外部システムに保存されたデータを直接クエリすることができるほか、外部テーブルを通じて外部データを OceanBase データベースに迅速にインポートすることもできます。外部テーブル機能により、OceanBase は HDFS、OSS、S3 などのファイルシステム上のデータに接続・アクセスでき、CSV、ORC、Parquet など多様な形式のデータファイルをサポートします。
注意点
外部データファイルのディレクトリ構造が時間、省市などの次元によって明確に階層化されている場合は、外部パーティションテーブルとして指定することを優先的に検討します。これにより、外部テーブルのクエリ時にパーティションプルーニングを行い、処理速度を向上させることができます。外部パーティションテーブルの作成構文については、MySQLモードで外部テーブルパーティションを作成するおよびOracleモードで外部テーブルパーティションを作成するを参照してください。
外部テーブルを作成する前に、外部データソースとOBServer間のネットワークが接続されていることを確認する必要があります。
適用シナリオ
外部テーブルは分析系業務でよく利用されるデータベース機能です。代表的な使用シナリオは以下の通りです:
- ログ分析:企業では毎日大量のログ情報が生成されます。アクセスログやエラーログなどが該当します。これらのログは通常、まずオブジェクトストレージに保存されます。これらのログファイルを参照する外部テーブルを作成することで、特定期間内のアクセス量の集計や、エラー発生頻度が最も高いモジュールの特定など、複雑なクエリ操作を迅速に実行できます。
- 履歴データ分析:長期保存が必要だが頻繁にはアクセスされない履歴データについては、コストの低いオブジェクトストレージやHDFSに格納することができます。外部テーブルを作成することで、必要に応じてこのデータを直接クエリできるため、ストレージ容量を節約しつつデータアクセスの効率を保証できます。
- マルチソースデータ統合:現代の企業のビジネスプロセスでは、多様な異なる情報システムが関わることが一般的です。各システムはそれぞれ独自の形式のデータを生成する可能性があります。外部テーブルを利用することで、異なるソースから様々な形式のデータファイル(CSV、Parquet、ORCなど)を読み込み、単一のプラットフォーム上でシステムを跨ぐ連携クエリを実行し、企業がより包括的なデータインサイトを得ることを支援します。
- データレイク分析:データレイクアーキテクチャが広く採用されるにつれ、ますます多くの企業が、様々なチャネルから収集された生データや半構造化データを一元的に管理・分析するためのデータレイクを構築しています。このような場合、データレイク内の特定の位置を参照する外部テーブルを作成することで、データレイクのデータ探索活動に直接参加し、意思決定プロセスを加速することができます。
- レイクハウスの高速化:データレイク内のオフラインデータウェアハウスは、非リアルタイムのクエリ分析を提供できますが、一部のシナリオではビジネスのリアルタイム要件を満たせない場合があります。外部テーブルを利用してデータを内部テーブルに迅速にインポートすることで、より即時性が高く、パフォーマンスの優れたクエリ分析機能を提供できます。
例
以下の例は、外部テーブルを使用してローカルのログファイルを読み取り、分析するシナリオをシミュレートしたものです。
ローカルフォルダには、CSV形式のファイルが含まれるフォルダが存在します。これらのファイルはパーティション外部テーブルを使用して管理・整理できます。ファイルの構成は以下のとおりです。
external_table_mock_log ├── 2023-06-01 │ ├── server_log1.csv │ └── server_log2.csv ├── 2023-06-02 │ └── server_log1.csv ├── 2023-06-03 │ ├── server_log1.csv │ ├── server_log2.csv │ └── server_log3.csv └── 2023-07-01 └── server_log1.csvここではserver_log1.csvファイルを例に説明します。ファイルの内容は以下のとおりです:
2023-06-01 14:42:37.568624, INTERNAL ERROR, -4007, Not supported 2023-06-01 14:42:38.861356, ITER END, -4008, traverse map failed 2023-06-01 14:42:39.931161, NEED WAIT, -4076, query and update last id fail 2023-06-01 14:42:39.931161, SUCCESS, 0, do flush cache successインポートファイルのパスを設定します。
システム変数
secure_file_privを設定し、インポートまたはエクスポート時にアクセス可能なパスを構成します。詳細な設定操作については、secure_file_privを参照してください。注意
セキュリティ上の理由から、システム変数
secure_file_privを設定する際は、ローカルUnixソケット接続を介してデータベースに接続し、このグローバル変数を変更するSQLステートメントを実行する必要があります。データベースに接続した後、自動パーティション外部テーブルを作成し、このディレクトリ内のファイルにアクセスします。SQLコマンドは以下のとおりです。
obclient> create external table ex_t1 ( time date, errstate varchar(30), errcode int, errcontent varchar(100), date_key date as (substr(substr(metadata$fileurl, instr(metadata$fileurl, '%') + 1), 1, 10)) ) location='/home/admin/external_table_mock_log' FORMAT ( type = 'csv', field_delimiter = ',', SKIP_BLANK_LINES = TRUE ) partition by (date_key) ;METADATA$FILEURL列にはパスとファイル名の情報が記録されています。ローカルファイルの場合、ip:port%2023-06-01/server_log2.csvが返されます。データをクエリします。
外部テーブルのデータをクエリします。
パーティションキーの値または範囲を指定してクエリすると、パーティションプルーニングが行われ、外部テーブルはそのパーティション内のファイルのみを読み取ります。
obclient> select * from ex_t1 where date_key = '2023-06-01';外部テーブルのファイルリストをクエリします。
外部テーブル作成後は、
ALL_OB_EXTERNAL_TABLE_FILESビューを使用してファイルリストを確認することもできます。
SELECT * FROM oceanbase.ALL_OB_EXTERNAL_TABLE_FILES WHERE TABLE_NAME='ex_t1';外部テーブルを使用して、データを内部テーブルにインポートします。
パラメータ
default_load_modeを変更することで、データインポートの動作を指定できます。詳細については、default_load_modeを参照してください。内部テーブルを作成します。
obclient> create table t1 ( time date, errstate varchar(30), errcode int, errcontent varchar(100), date_key date ) partition by list columns(date_key) (partition p20230601 values in ('2023-06-01'), partition p20230602 values in ('2023-06-02'), partition p20230603 values in ('2023-06-03'), partition p20230701 values in ('2023-07-01') );外部データを内部テーブルにインポートします。
obclient> insert into t1 select * from ex_t1;