概要
このステートメントは、データベース内に新しい外部テーブルを作成するために使用されます。
外部テーブルは、データベースマネジメントシステムにおける重要な機能の一つです。通常、データベース内のテーブルはデータベースのストレージスペースに格納されますが、外部テーブルのデータは外部ストレージサービスに格納されます。
外部テーブルを作成する際には、データのファイルパスとファイル形式を定義する必要があります。その後、ユーザーは外部テーブルを使用して外部ストレージサービスからファイルのデータを読み取ることができます。外部テーブルは読み取り専用であり、クエリステートメントで使用できますが、DML操作を実行することはできません。また、外部テーブルには制約の定義やインデックスの作成はサポートされていません。
構文
CREATE EXTERNAL TABLE table_name (column_definition_list)
LOCATION = 'file_name'
{FORMAT = (format_type_options)
| PROPERTIES = (properties_type_options)}
[PARTITION BY (column_name [, column_name ...])]
[PARTITION_TYPE = USER_SPECIFIED]
[PATTERN = 'regex_pattern']
[AUTO_REFRESH = 'xxx'];
column_definition_list:
column_definition [, column_definition ...]
column_definition:
column_name column_type [AS expr]
format_type_options:
type_csv_option
| type_parquet_option
| type_orc_option
type_csv_option:
TYPE = 'CSV'
LINE_DELIMITER = '<string>' | <expr>
FIELD_DELIMITER = '<string>' | <expr>
ESCAPE = '<character>' | <expr>
FIELD_OPTIONALLY_ENCLOSED_BY = '<character>' | <expr>
ENCODING = 'charset'
NULL_IF = ('<string>' | <expr>, '<string>' | <expr> ...)
SKIP_HEADER = <int>
SKIP_BLANK_LINES = {TRUE | FALSE}
TRIM_SPACE = {TRUE | FALSE}
EMPTY_FIELD_AS_NULL = {TRUE | FALSE}
IGNORE_LAST_EMPTY_COLUMN = {TRUE | FALSE}
type_parquet_option:
TYPE = 'PARQUET'
type_orc_option:
TYPE = 'ORC'
properties_type_options:
type_odps_option
type_odps_option:
TYPE = 'ODPS'
ACCESSID = '<string>'
ACCESSKEY = '<string>'
ENDPOINT = '<string>',
PROJECT_NAME = '<string>',
SCHEMA_NAME = '<string>',
TABLE_NAME = '<string>',
QUOTA_NAME = '<string>',
COMPRESSION_CODE = '<string>',
API_MODE = {"tunnel_api" | "storage_api"},
SPLIT = {"byte" | "row"}
パラメータの説明
| パラメータ | 説明 |
|---|---|
| table_name | 作成する外部テーブルの名前。 |
| column_name | 外部テーブルの列名。デフォルトでは、ファイル内のデータ列と外部テーブルで定義された列は自動的に順序に対応付けられます。 |
| column_type | 外部テーブルの列タイプを定義できますが、制約(例えば、DEFAULT、NOT NULL、UNIQUE、CHECK、PRIMARY KEY、FOREIGN KEY など)は定義できません。 |
| AS expr | 列マッピングを手動で指定するために使用されます。ファイル内の列の順序が外部テーブルで定義された列の順序と異なる場合、metadata$filecol{N} で表される擬似列を使用して、外部テーブルの列とファイル内の第N列との対応関係を指定できます。例えば、c2 INT AS (metadata$filecol4) は、外部テーブルの c2 列がファイル内の第4列に対応することを示します。注意が必要なのは、手動で列マッピングを指定した場合、自動的なマッピング関係は無効になり、すべての列について手動でマッピング関係を定義する必要があります。 |
| LOCATION = 'file_name' | 外部テーブルファイルの格納パスを指定します。通常、外部テーブルのデータファイルは単独のディレクトリに配置され、その中にサブディレクトリが含まれる場合があります。テーブルを作成する際、外部テーブルはこのディレクトリ内のすべてのファイルを自動的に収集します。詳細については、以下の file_name を参照してください。 |
| FORMAT = (format_type_options) | 外部ファイル形式の関連プロパティを指定します。TYPE を使用して CSV、PARQUET、ORC ファイル形式をエクスポートし、TYPE は空にすることはできません。詳細については、以下の format_type_options を参照してください。 |
| PROPERTIES = (properties_type_options) | 外部ファイル形式の関連プロパティを指定します。TYPE を使用して ODPS ファイル形式をエクスポートし、TYPE は空にすることはできません。詳細については、以下の properties_type_options を参照してください。 |
| PATTERN | フィルターとして使用される正規表現パターン文字列を指定します。LOCATION ディレクトリ内のファイルをフィルター処理するために使用されます。各 LOCATION ディレクトリ内のファイルパスについて、このパターン文字列とマッチする場合、外部テーブルはそのファイルにアクセスします。マッチしない場合は、外部テーブルはそのファイルをスキップします。このパラメータを指定しない場合、デフォルトでは LOCATION ディレクトリ内のすべてのファイルにアクセスできます。外部テーブルは、LOCATION 指定パス下で PATTERN に一致するファイルリストをデータベースシステムテーブルに保存し、外部テーブルのスキャン時にこのリストに基づいて外部のファイルにアクセスします。 |
| PARTITION_TYPE = USER_SPECIFIED | 自分でパーティションを追加および削除する必要があり、外部テーブルがパーティションを自動的に管理するのではなく、指定する場合は、PARTITION_TYPE = USER_SPECIFIED フィールドを指定する必要があります。 |
| AUTO_REFRESH = 'xxx' | 外部テーブルの自動リフレッシュを指定します。値の範囲は次のとおりです:
|
file_name
外部ファイルの保存パスには以下の形式があります:
ファイルがローカルにある場合、ローカル
LOCATIONの形式は:LOCATION = '[file://] local_file_path'です。ここで、local_file_pathは相対パスでも絶対パスでも構いません。相対パスを指定する場合、現在のディレクトリはOceanBaseデータベースのインストールディレクトリである必要があります。secure_file_privは、OBServerノードがアクセスできるファイルパスを設定します。local_file_pathはsecure_file_privパスのサブパスでなければなりません。ファイルがリモートにある場合、リモート
LOCATIONの形式は次のとおりです:注意
オブジェクトストレージのパスを使用する場合、オブジェクトストレージのパスの各パラメータは
&文字で区切られます。入力したパラメータ値に英字の大文字・小文字、数字、/-_$+=およびワイルドカードのみを含めるようにしてください。上記以外の文字を入力すると、設定が失敗する可能性があります。ファイルがOSS/S3上にある場合、形式は:
LOCATION = '{oss\|s3}://$ACCESS_ID:$ACCESS_KEY@$HOST:s3_region/remote_file_path'です。ここで、$ACCESS_ID、$ACCESS_KEY、および$HOSTは、Alibaba Cloud OSSやAWS S3、およびS3プロトコル互換のオブジェクトストレージにアクセスするために必要な設定情報であり、s3_regionはS3を使用する際の選択されたリージョン情報です。これらの機密性の高いアクセス情報は、暗号化された形でデータベースのシステムテーブルに格納されます。ファイルがHDFS上にある場合、以下の形式があります:
単一ノードNameNode (NN)アドレスに基づいてクラスタにアクセスする形式は:
LOCATION = hdfs://localhost:port/PATHです。ここで、localhostはHDFSのアドレスを指し、portはHDFSのポート番号を指し、PATHはHDFS内のファイルパスを指します。Kerberos認証付きの形式は:
LOCATION = 'hdfs://localhost:port/user?principal=xxx&keytab=xxx&krb5conf=xxx&configs=xxx'です。ここで:principal:ログイン認証ユーザーを指します。keytab:ユーザー認証用のキーファイルパスを指定します。krb5conf:ユーザーがKerberos環境を使用するための記述ファイルパスを指定します。configs:追加のHDFS構成パラメータを指定します。デフォルトでは空ですが、Kerberos環境の場合は通常このパラメータには値が設定されており、設定が必要です。例えば:dfs.data.transfer.protection=authentication,privacy、データ転送保護レベルをauthenticationおよびprivacyと指定します。
Hadoop HA (High Availability)に基づく論理ネームサービスによるクラスタへのアクセス形式は:
LOCATION = hdfs://nameserviceID/PATHです。ここで、nameserviceIDはHDFSのHadoop HAの論理ネームサービスIDを指し、PATHはファイルパスを指します。説明
クライアント側のOBServerの設定に、HAクラスタの
nameservice定義とフェイルオーバー戦略が含まれていることを確認してください。Kerberos認証付きの形式は:
LOCATION = 'hdfs://nameserviceID/PATH?principal=xxx&keytab=xxx&krb5conf=xxx&configs=dfs.data.transfer.protection=${string}#dfs.nameservices=${nameservice id}#dfs.ha.namenodes.${nameservice id}=${namenode1}, ${namenode2}#dfs.namenode.rpc-address.${nameservice id}.${namenode1}=${namenode 1 address}#dfs.namenode.rpc-address.${nameservice id}.${namenode2}=${namenode 2 address}#dfs.ha.automatic-failover.enabled.${nameservice id}=true#dfs.client.failover.proxy.provider.${nameservice id}=org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider'です。ここで:principal:ログイン認証ユーザーを指し、非プライマリノードNNのpricipalに設定します。keytabとkrb5conf:単一ノードNNの設定と同じです。configs:追加のHDFS構成パラメータを指定します。複数の構成パラメータを設定する必要があり、HA構成パラメータとセキュリティ構成パラメータに関連しています:dfs.data.transfer.protection=${string}:クラスタのdfs.data.transfer.protectionの設定と一致させます。dfs.nameservices=${nameservice id}:現在のHAクラスタのnamesevice(別名) を指定します。dfs.ha.namenodes.${nameservice id}=${namenode1}, ${namenode2}:HAクラスタのnamenodeバックアップIDリストを指定します。dfs.namenode.rpc-address.${nameservice id}.${namenode1}=${namenode 1 address}:namenode1の具体的なnamenodeを設定し、クライアントのルーティングを容易にするために使用されます。dfs.namenode.rpc-address.${nameservice id}.${namenode2}=${namenode 2 address}:namenode2の具体的なnamenodeを設定し、クライアントのルーティングを容易にするために使用されます。dfs.ha.automatic-failover.enabled.${nameservice id}=true:HAクラスタが関連リクエストを取得した後、自動的に利用可能なnamenodeを取得してサービス応答を行います。dfs.client.failover.proxy.provider.${nameservice id}=org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider:HAクラスタがプライマリとバックアップ間の切り替えを行う論理ツールクラスを指示します。また、HAクラスタが必要とする独自の論理をカスタマイズしてパッケージ化してアップロードすることもできます。
注意
HA関連の一部構成パラメータは
namespaceとバインドされています。例えば、以下の例3のmyclusterに注意し、関連する構成パラメータを組み合わせて設定してください。
format_type_options
TYPE = 'CSV':外部ファイルの形式をCSVタイプと指定します。また、以下のフィールドも含まれます:LINE_DELIMITER:CSVファイルの行区切り文字を指定します。デフォルト値はLINE_DELIMITER='\n'です。FIELD_DELIMITER:CSVファイルの列区切り文字を指定します。デフォルト値はFIELD_DELIMITER='\t'です。ESCAPE:CSVファイルのエスケープ文字を指定します。1文字のみ許可されます。デフォルト値はESCAPE ='\'です。FIELD_OPTIONALLY_ENCLOSED_BY:CSVファイルでフィールド値を囲む記号を指定します。デフォルト値は空です。注意
外部テーブルデータファイルに
NULL値(文字列ではない NULL、つまり "NULL" でないもの)が含まれている場合、FIELD_OPTIONALLY_ENCLOSED_BYパラメータを明示的に設定する必要があります。このパラメータの値は空にできません。ENCODING:ファイルの文字セットエンコーディング形式を指定します。現在のMySQLモードでサポートされているすべての文字セットについては、文字セットを参照してください。指定しない場合、デフォルト値はUTF8MB4です。NULL_IF:NULLとして処理される文字列を指定します。デフォルト値は空です。SKIP_HEADER:ヘッダーをスキップし、スキップする行数を指定します。SKIP_BLANK_LINES:空白行をスキップするかどうかを指定します。デフォルト値はFALSEであり、空白行をスキップしません。TRIM_SPACE:ファイル内のフィールドの先頭および末尾のスペースを削除するかどうかを指定します。デフォルト値はFALSEであり、ファイル内のフィールドの先頭と末尾のスペースは削除されません。EMPTY_FIELD_AS_NULL:空文字列をNULLとして処理するかどうかを指定します。デフォルト値はFALSEであり、空文字列をNULLとして処理しません。IGNORE_LAST_EMPTY_COLUMN:ファイルの1行末尾が空のフィールドである場合(つまり、行区切り文字の前に列区切り文字がある場合)、その空のフィールドを無視するかどうかを指定します。デフォルト値はTRUEであり、最後の空のフィールドを無視します。説明
V4.3.5バージョンでは、V4.3.5 BP2バージョンから
IGNORE_LAST_EMPTY_COLUMNがサポートされています。
TYPE = 'PARQUET':外部ファイルの形式をPARQUETタイプと指定します。TYPE = 'ORC':外部ファイルの形式をORCタイプと指定します。
properties_type_options
TYPE = 'ODPS':外部ファイルの形式をODPSタイプと指定します。また、以下のフィールドも含まれます:ACCESSID:アリババクラウドアカウントのAccessKey IDを指定し、認証に使用します。ACCESSKEY:指定されたAccessKey IDに対応するAccessKey Secretを指定し、認証に使用します。ENDPOINT:ODPSサービスの接続アドレスを指定します。PROJECT_NAME:アクセス対象のODPSプロジェクト名を指定します。SCHEMA_NAME:オプションです。ODPS内のスキーマ名を指定します。TABLE_NAME:ODPS内のターゲットテーブル名を指定します。QUOTA_NAME:オプションです。使用するQuotaを指定します。COMPRESSION_CODE:オプションです。データソースの圧縮形式を指定します。サポートされる圧縮形式はZLIB、ZSTD、LZ4、ODPS_LZ4の4種類です。設定しない場合は、圧縮を有効にしません。API_MODE:ODPSのAPIモードを指定します。許容される値は以下のとおりです:説明
OceanBaseデータベースV4.3.5では、V4.3.5 BP3以降のバージョンから
API_MODEおよびSPLITパラメータがサポートされています。tunnel_api(デフォルト値):特別なネットワーク構成不要:すべてのデプロイシナリオで利用可能で、OceanBaseデータベースとMaxComputeが同一VPC(仮想プライベートクラウド)内に配置されている必要はありません。
MaxComputeの追加権限不要:認証にはAccessIDとAccessKeyのみを提供すれば十分であり、MaxCompute Storage API権限の有効化は不要です。
対象環境:
- OceanBaseデータベースとMaxComputeが同一VPCにデプロイされていない場合。
- MaxCompute Storage APIが有効になっていない場合。
- データ転送におけるレイテンシー要件が低い場合。
storage_api:ネットワーク依存性:OceanBaseデータベースとMaxComputeが同一VPCにデプロイされていることを要件として、低レイテンシーかつ高スループットのデータ転送を実現します。
権限依存性:MaxComputeにおいてStorage API権限を有効にし、アクセスキー(AccessKey)が該当する権限を持っていることを確認する必要があります。
対象環境:
- OceanBaseデータベースとMaxComputeが同一VPCネットワークに属している場合。
- MaxCompute Storage APIが有効になっている場合。
- データ量が非常に大きい場合またはリアルタイム性の要件が高い場合。
SPLIT:storage_apiを使用する場合に、各スレッドにタスクを切り分ける際の単位をbyteまたはrowとして指定します。1つのテーブルの各行のデータサイズに大きな差がある場合、SPLIT``byteに設定され、その他の場合rowに設定されます。
使用方法
- 外部ファイルが削除された場合、外部テーブルアクセスファイルリスト内のファイルは存在しなくなり、その場合は外部テーブルは存在しないファイルを無視します。
- 外部ファイルが変更された場合、外部テーブルは外部ファイルの最新データにアクセスします。外部ファイルの変更と外部テーブルのクエリが同時に発生する場合、予期しない結果が生じる可能性があるため、外部テーブルのクエリ中に外部ファイルを変更することは避けてください。
- 外部ディレクトリに新しいファイルが追加された場合、外部テーブルはファイルリスト内のファイルのみにアクセスします。新しいファイルを外部テーブルのファイルリストに追加する必要がある場合は、外部テーブルファイルの更新操作を実行する必要があります。
例
例1
データを準備します。まず、
secure_file_privのパスを/home/admin/に設定し、インポートする外部テーブルのデータに対応するCSVファイルextdata.csvを現在接続しているOBServerノードの/home/admin/testパスに配置します。グローバルセキュリティパスの設定例は以下のとおりです。
obclient> SET GLOBAL secure_file_priv = "/home/admin/"; Query OK, 0 rows affected obclinet> \q Bye説明
secure_file_privはGLOBAL変数であるため、\qを実行して終了させる必要があります。CSVファイルの内容は以下のとおりです:
1,'Dave','Smith','dsmith@outlook.com','friend',32 2,'Xena','Johnson','xjonson@outlook.com','contact',45 3,'Fred','Jackon','fjackson@outlook.com','co-worker',19 4,'Alma','Tyler','atyler@outlook.com','friend',53ユーザーテナントでデータベースにログインした後、外部テーブル
contactsを作成します。obclient> CREATE EXTERNAL TABLE contacts ( id INT, firstname VARCHAR(100), lastname VARCHAR(100), email VARCHAR(255), category CHAR(30), age NUMBER ) LOCATION = '/home/admin/test' FORMAT = ( TYPE = 'CSV' FIELD_DELIMITER = ',' FIELD_OPTIONALLY_ENCLOSED_BY ='\'' ) PATTERN = 'extdata.csv';外部テーブル
contactsのデータをクエリします。obclient> SELECT * FROM contacts; +----+-----------+----------+----------------------+-----------+------+ | id | firstname | lastname | email | category | age | +----+-----------+----------+----------------------+-----------+------+ | 1 | Dave | Smith | dsmith@outlook.com | friend | 32 | | 2 | Xena | Johnson | xjonson@outlook.com | contact | 45 | | 3 | Fred | Jackon | fjackson@outlook.com | co-worker | 19 | | 4 | Alma | Tyler | atyler@outlook.com | friend | 53 | +----+-----------+----------+----------------------+-----------+------+ 4 rows in set
例2
HDFS上のあるファイルパスにcsvファイルが存在する場合、そのファイルの内容は以下のとおりです:
$hdfs dfs -cat /user/test_tbl1.csv 1,'Emma','2021-09-01' 2,'William','2021-09-02' 3,'Olivia','2021-09-03'HDFS外部テーブルを作成します。
ターゲットHDFS環境でKerberos認証が未設定の場合
CREATE EXTERNAL TABLE test_tbl1_csv_mysql ( id INT, name VARCHAR(50), c_date DATE ) LOCATION = 'hdfs://${hadoop namenode hostname}:${hadoop namenode port}/user' FORMAT = ( TYPE = 'CSV' FIELD_DELIMITER = ',' FIELD_OPTIONALLY_ENCLOSED_BY ='\'' ) PATTERN = 'test_tbl1.csv';注意
ここで、
hadoop namenode hostnameおよびhadoop namenode portはHDFSノードのホスト名とポートを指し、実際の値に置き換える必要があります。ターゲットHDFS環境でKerberos認証が有効の場合
環境準備 現在のHDFS連携ではJNIフレームワークを使用しているため、対応する環境にはJava環境のデプロイをサポートする必要があります。OBServerが複数のマシンノードにデプロイされている場合、対応するOBServerマシンノードにも以下の環境設定を行う必要があります。単一ノードのみに設定することはできません。
ステップ1: JAVA環境をデプロイ・設定します
openjdkから最新バージョンのopenjdk 8をダウンロードできます。
ステップ2: 対応するインストールパッケージを解凍します
解凍すると、次のファイルが表示されます:
$ ls $JAVA_HOME ASSEMBLY_EXCEPTION bin include jre lib LICENSE man NOTICE release sample src.zip THIRD_PARTY_READMEステップ3: 依存するHDFS.so動的ライブラリをデプロイ・設定します
https://mirrors.aliyun.com/oceanbase/。 ダウンロード後、次のコマンドを実行してインストールします。
sudo rpm -Uvh devdeps-hdfs-sdk-3.3.6-xxxxx.xxx.xxx.rpm次のコマンドを実行して、対応するインストールが期待どおりであることを確認します。
libhdfs.soおよびlibhdfs.so.0.0.0ファイルが必要であり、対応するソフトウェアリンクが正常である必要があります。$ll /usr/local/oceanbase/deps/devel/lib total 376 lrwxrwxrwx 1 root root 16 Dec 24 19:49 libhdfs.so -> libhdfs.so.0.0.0 -rwxr-xr-x 1 root root 384632 Dec 24 19:09 libhdfs.so.0.0.0ステップ4: 依存するjarパッケージのパスをデプロイ・設定します
必要なjarパッケージをダウンロードした後、次のコマンドを実行して解凍・インストールします:
sudo rpm -Uvh devdeps-java-extensions-3.3.6--xxxxx.xxx.xxx.rpm対応するインストールが期待どおりであることを確認します:
$ll /home/admin/oceanbase/jni_packages total 52756 drwxr-sr-x 4 root root 4096 Dec 24 20:25 hadoop drwxr-xr-x 3 root root 4096 Dec 24 20:25 lib -rw-r--r-- 1 root root 54008720 Dec 24 19:52 oceanbase-odps-connector-jar-with-dependencies.jarステップ4: 依存するjarパッケージのパスをデプロイ・設定します:
jarパッケージをダウンロードします:阿里云OceanBaseイメージからjarパッケージをダウンロードします。
注意
- OceanBaseデータベースV4.3.5 BP1および以前のバージョン:1.0.0バージョンのdevdeps-java-extensions RPMインストールパッケージをダウンロードしてください。
- OceanBaseデータベースV4.3.5 BP2以降のバージョン:1.0.1バージョンのdevdeps-java-extensions RPMインストールパッケージをダウンロードしてください。
- OceanBaseデータベースV4.4.0バージョン:1.0.1バージョンのdevdeps-java-extensions RPMインストールパッケージをダウンロードしてください。
jarパッケージをインストールします:必要のjarパッケージをダウンロードした後、次のコマンドを実行して解凍・インストールします:
sudo rpm -Uvh devdeps-java-extensions-x.x.x-xxxxxxxxxxxx.xxx.xxxxxx.rpm対応するインストールが期待どおりであることを確認します:
$ll /home/admin/oceanbase/jni_packages total 52756 drwxr-sr-x 4 root root 4096 Dec 24 20:25 hadoop drwxr-xr-x 3 root root 4096 Dec 24 20:25 lib -rw-r--r-- 1 root root 54008720 Dec 24 19:52 oceanbase-odps-connector-jar-with-dependencies.jar
OBSERVERを起動します
HDFSの第三者外部テーブルを使用する前に、対応するOBServerノードの設定を行う必要があります。設定については以下のとおりです:
説明
現在のOBServerがサポートするJNI関連構成パラメータは、柔軟かつ即時に設定・反映することはできません。そのため、関連するJava環境変数の構成パラメータを変更する場合は、OBServerの再起動が必要です。以下のすべての構成パラメータはクラスタ構成であり、一度設定すればすべてのノードで個別に設定する必要はありません。
sysテナントを使用して、次のコマンドを実行して、OBServerがサポートするJava環境を有効にします:
alter system set ob_enable_java_env=true;次のコマンドを実行して、OBServerのJavaホームパスを設定します:
alter system set ob_java_home="/home/user/openjdk/jdk8u422-b05";説明
パスはOpen JDK Javaインストールパスから取得します。
Java環境起動に関連する構成パラメータを設定します:
注意
この構成パラメータの変更は、OBServerの再起動が必要です。現在のHDFS連携で使用されるメモリコピーは、HDFSデータストリームを直接C++メモリヒープにコピーするため、
-Xmx2048mと-Xms2048mの設定を適宜削減することができます。alter system set ob_java_opts="-Djdk.lang.processReaperUseDefaultStackSize=true -XX:+HeapDumpOnOutOfMemoryError -Xmx2048m -Xms2048m -Xloggc:/home/user/jvmlogs/gc.log -XX:+PrintGCDetails -XX:+PrintGCDateStamps -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/home/user/jvmlogs/heapdumps/ -XX:+UseG1GC -XX:-CriticalJNINatives";説明
ここで、
/home/user/jvmlogsおよび/home/user/jvmlogs/heapdumpsは、対応するログフォルダーパスであり、手動で作成する必要があります。使用可能なLD_LIBRARY_PATHパスを設定します:
説明
OBServerがサポートするJNI SDKは拡張機能の一部であるため、動的ライブラリのダイナミックロード方式を使用しています。そのため、対応する動的ライブラリパスを追加で設定し、LD_LIBRARY_PATHを設定する必要があります。また、対応するOBServerノードすべてで設定を行う必要があります。
$ vim ~/.bashrc export LD_LIBRARY_PATH=/home/user/openjdk/jdk8u422-b05/jre/lib/amd64/server:/usr/local/oceanbase/deps/devel/lib
HDFS外部テーブルを作成します
注意
Kerberos認証設定がある場合、対応するOBServerノードにkeytab(ユーザー認証秘密鍵ファイル)とkrb5confファイルをデプロイ・設定する必要があります。
CREATE EXTERNAL TABLE partsupp ( PS_PARTKEY INTEGER , PS_SUPPKEY INTEGER , PS_AVAILQTY INTEGER , PS_SUPPLYCOST DECIMAL(15,2) , PS_COMMENT VARCHAR(199) ) LOCATION = 'hdfs://localhost:8020/tpch_csv?principal=principal_str&keytab=/path/to/keytab&krb5conf=/path/to/krb5conf_file&configs=xxx=xxx#xxx=xxx' FORMAT = ( TYPE = 'CSV' FIELD_DELIMITER = '|' FIELD_OPTIONALLY_ENCLOSED_BY ='"' ) PATTERN = 'partsupp.tbl';
外部テーブルのデータを照会します。
select * from test_tbl1_csv_mysql;実行結果は次のとおりです:
+----+----------+------------+ | id | name | c_date | +----+----------+------------+ | 1 | Emma | 2021-09-01 | | 2 | William | 2021-09-02 | | 3 | Olivia | 2021-09-03 | +----+----------+------------+ 3 rows in set
例3
HDFS上のあるファイルパスにcsvファイルがあり、その内容は以下のとおりであるとします:
$hdfs dfs -cat /hadoop_ha_test/test_simple.csv 1,lili,19 2,alic,20 3,solvi,21Observer関連のJNI構成パラメータを有効化します。
JNIの詳細な設定については、ステップ2のターゲットHDFS環境でKerberos認証が有効になっている場合の環境準備の内容を参照してください。または、OceanBaseデータベースJAVA SDK環境のデプロイを参照してください。
HDFS外部テーブルを作成します。
obclient> CREATE EXTERNAL TABLE test_ha ( id INT, r_name VARCHAR(100), age INT ) LOCATION = 'hdfs://mycluster/hadoop_ha_test?principal=ha/xxx@xxx.com&keytab=/path/to/ha.keytab&krb5conf=/path/to/krb5conf_file&configs=dfs.data.transfer.protection=integrity#dfs.nameservices=mycluster#dfs.ha.namenodes.mycluster=nn1,nn2#dfs.namenode.rpc-address.mycluster.nn1=localhost1:port#dfs.namenode.rpc-address.mycluster.nn2=localhost2:port#dfs.ha.automatic-failover.enabled.mycluster=true#dfs.client.failover.proxy.provider.mycluster=org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider' FORMAT = ( TYPE = 'CSV' FIELD_DELIMITER = ',' FIELD_OPTIONALLY_ENCLOSED_BY = '\'' ) PATTERN = 'test_simple.csv';外部テーブルのデータをクエリします。
obclient> SELECT * FROM test_ha;実行結果は次のとおりです:
+----+--------+-------+ | id | r_name | age | +----+--------+-------+ | 1 | lili | 19 | | 2 | alic | 20 | | 3 | solvi | 21 | +----+--------+-------+ 3 rows in set