本記事では、SQLステートメントを使用して外部テーブルを作成する方法について説明します。また、外部テーブルの作成前提条件、概要、注意事項などを紹介し、いくつかの例も示します。
外部テーブルの概要
外部テーブルとは、論理的なテーブルオブジェクトのことで、実際のデータはデータベース内部ではなく、外部ストレージサービスに保存されます。
外部テーブルの詳細については、外部テーブルについてをご参照ください。
前提条件
外部テーブルを作成する前に、以下の事項を確認してください:
OceanBaseクラスタがデプロイ済みで、Oracleモードのテナントが作成されていること。詳細な操作については、クラスタインスタンスの作成およびテナントの作成をご参照ください。
OceanBaseデータベースのOracle互換モードのテナントに接続されていること。データベースへの接続に関する詳細は、接続方法の概要をご参照ください。
外部テーブルの作成には、現在のユーザーに
CREATE TABLE権限が付与されている必要があります。現在のユーザー権限の確認および関連する操作については、テナントアカウントの管理をご参照ください。
注意事項
外部テーブルではクエリ操作のみ実行可能で、DML操作は実行できません。
外部テーブルをクエリする際、アクセス対象の外部ファイルが削除されている場合、システムはエラーを報告せず、空行を返します。
外部テーブルがアクセスするファイルは外部ストレージシステムによって管理されているため、外部ストレージが利用不可の場合、外部テーブルのクエリはエラーとなります。
外部テーブルのデータは外部データソースに保存されているため、クエリ時にはネットワークやファイルシステムなどの要素が関わり、クエリのパフォーマンスに影響を与える可能性があります。そのため、外部テーブルを作成する際には、適切なデータソースと最適化戦略を選択し、クエリ効率を向上させる必要があります。
コマンドラインを使用した外部テーブルの作成
CREATE EXTERNAL TABLE ステートメントを使用して外部テーブルを作成してください。
外部テーブル名の定義
外部テーブルを作成する際には、まず外部テーブルに名前を付ける必要があります。混乱や曖昧さを避けるため、通常のテーブルと外部テーブルを区別するために、特定の命名規則やプレフィックスを使用することを推奨します。例えば、外部テーブル名のサフィックスとして _csv を使用できます。
例:
学生情報に関する外部テーブルを作成する場合、students_csv という名前を付けることができます。
CREATE EXTERNAL TABLE students_csv external_options
注意
外部テーブルの他の属性が追加されていないため、上記のSQLステートメントは実行できません。
列の定義
外部テーブルの列には、DEFAULT、NOT NULL、UNIQUE、CHECK、PRIMARY KEY、FOREIGN KEY などの制約を定義することはできません。
外部テーブルがサポートする列の型は、通常のテーブルと同じです。OceanBaseデータベースのOracleモードでサポートされているデータ型および詳細については、組み込みデータ型の概要に関するドキュメントをご参照ください。
LOCATIONの定義
LOCATIONオプションは、外部テーブルファイルの保存先パスを指定するために使用されます。通常、外部テーブルのデータファイルは単独のディレクトリに保存され、そのフォルダにはサブディレクトリを含むことができます。テーブル作成時、外部テーブルはそのディレクトリ内のすべてのファイルを自動的に収集します。
OceanBaseデータベースは、以下の2種類のパス形式をサポートしています:
ローカルLocation形式:
LOCATION = '[file://] local_file_path'注意
ローカルLocation形式を使用する場合は、システム変数
secure_file_privを設定してアクセス可能なパスを構成する必要があります。詳細については、secure_file_privに関するドキュメントをご参照ください。リモートLocation形式:
LOCATION = '{oss|cos}://$ACCESS_ID:$ACCESS_KEY@$HOST/remote_file_path'$ACCESS_ID、$ACCESS_KEY、$HOSTは、Alibaba Cloud OSSまたはTencent Cloud COSにアクセスするために必要なアクセス情報であり、これらの機密アクセス情報は暗号化されてデータベースのシステムテーブルに保存されます。
FORMATの定義
FORMAT = ( TYPE = 'CSV'... )は、外部ファイルの形式をCSVタイプとして指定するために使用されます。以下のパラメータがあります:TYPE:外部ファイルのタイプを指定します。LINE_DELIMITER:CSVファイルの行区切り文字を指定します。デフォルト値はLINE_DELIMITER='\n'です。FIELD_DELIMITER:CSVファイルの列区切り文字を指定します。デフォルト値はFIELD_DELIMITER='\t'です。ESCAPE:CSVファイルのエスケープ文字を指定します。1バイトのみ指定可能です。デフォルト値はESCAPE ='\'です。FIELD_OPTIONALLY_ENCLOSED_BY:CSVファイルでフィールド値を囲む記号を指定します。デフォルト値は空です。ENCODING:ファイルの文字セットエンコーディング形式を指定します。現在MySQLモードでサポートされているすべての文字セットについては、文字セットに関するドキュメントをご参照ください。指定しない場合、デフォルト値はUTF8MB4です。NULL_IF:NULLとして処理される文字列を指定します。デフォルト値は空です。SKIP_HEADER:ファイルヘッダーをスキップし、スキップする行数を指定します。SKIP_BLANK_LINES:空白行をスキップするかどうかを指定します。デフォルト値はFALSEで、空白行はスキップされません。TRIM_SPACE:ファイル内のフィールドの先頭と末尾のスペースを削除するかどうかを指定します。デフォルト値はFALSEで、ファイル内のフィールドの先頭と末尾のスペースは削除されません。EMPTY_FIELD_AS_NULL:空文字列をNULLとして処理するかどうかを指定します。デフォルト値はFALSEで、空文字列はNULLとして処理されません。
FORMAT = ( TYPE = 'PARQUET'... )は、外部ファイルの形式をPARQUETタイプとして指定するために使用されます。
(オプション)PATTERNの定義
PATTERNオプションは、LOCATIONディレクトリ配下のファイルをフィルタリングするための正規表現パターン文字列を指定するために使用されます。LOCATIONディレクトリ配下の各ファイルパスがこのパターン文字列と一致する場合、外部テーブルはそのファイルにアクセスします。一致しない場合は、そのファイルをスキップします。このパラメータを指定しない場合、デフォルトではLOCATIONディレクトリ配下のすべてのファイルにアクセスできます。外部テーブルはLOCATIONで指定されたパス配下でPATTERNに一致するファイルのリストをデータベースのシステムテーブルに保存し、外部テーブルのスキャン時にこのリストに基づいて外部ファイルにアクセスします。
(オプション)外部テーブルのパーティションを定義する
自動で外部テーブルのパーティションを定義する
外部テーブルは、パーティションキーの定義に基づいて計算された式に従って、パーティションを追加します。クエリ実行時にパーティションキーの値または範囲を指定すると、パーティションプルーニングが行われ、外部テーブルはそのパーティション内のファイルのみを読み取ります。
手動で外部テーブルのパーティションを定義する
外部テーブルによる自動管理ではなく、手動でパーティションの追加や削除を行う場合は、PARTITION_TYPE = USER_SPECIFIED フィールドを指定する必要があります。
例
注意
例に含まれるIPアドレスに関するコマンドはマスキング処理されています。検証時にはご自身のマシンの実際のIPアドレスを記入してください。
以下では、外部ファイルの場所がローカルにある場合とOceanBaseデータベースのOracleモードにある場合の2つの例を挙げ、外部テーブルを作成する手順を示します。
外部ファイルを準備します。
以下のコマンドを実行し、OBServerノードにログインするマシンの
/home/admin/external_csvディレクトリにtest_tbl1.csvファイルを作成します。[admin@xxx /home/admin/external_csv]# vi test_tbl1.csvファイルの内容は以下のとおりです:
1,'Emma' 2,'William' 3,'Olivia'インポートファイルのパスを設定します。
注意
セキュリティ上の理由から、システム変数
secure_file_privを設定する際は、ローカルソケット接続を介してデータベースに接続し、このグローバル変数を変更するSQLステートメントを実行する必要があります。詳細については、secure_file_priv に関するドキュメントをご参照ください。以下のコマンドを実行し、OBServerノードが存在するマシンにログインします。
ssh admin@10.10.10.1以下のコマンドを実行し、ローカルUnixソケット接続を介してテナント
oracle001に接続します。obclient -S /home/admin/oceanbase/run/sql.sock -usys@oracle001 -p******以下のSQLコマンドを実行し、インポートパスを
/home/admin/external_csvに設定します。SET GLOBAL secure_file_priv = "/home/admin/external_csv";
テナント
oracle001に再接続します。例:
obclient -h10.10.10.1 -P2881 -usys@oracle001 -p****** -A以下のSQLコマンドを実行して、外部テーブル
test_tbl1_csvを作成します。CREATE EXTERNAL TABLE test_tbl1_csv ( id INT, name VARCHAR(50) ) LOCATION = '/home/admin/external_csv' FORMAT = ( TYPE = 'CSV' FIELD_DELIMITER = ',' FIELD_OPTIONALLY_ENCLOSED_BY ='''' ) PATTERN = 'test_tbl1.csv';以下のSQLコマンドを実行して、外部テーブル
test_tbl1_csvのデータを確認します。SELECT * FROM test_tbl1_csv;実行結果は次のとおりです:
+------+---------+ | ID | NAME | +------+---------+ | 1 | Emma | | 2 | William | | 3 | Olivia | +------+---------+ 3 rows in set
関連情報
外部テーブルがアクセス可能なファイルを表示および更新する方法の詳細については、外部ファイルの管理に関するドキュメントをご参照ください。