このトピックでは、`CREATE EXTERNAL TABLE` ステートメントを使用して Hologres 外部テーブルを作成する方法について説明します。Hologres データソース、STS 認証情報、デュアル署名モード、マッピング先のテーブル、Java Database Connectivity (JDBC) ドライバー情報などの詳細を指定する方法を解説します。
機能紹介
Hologres は、PostgreSQL プロトコルと互換性があり、MaxCompute とシームレスに統合されたリアルタイムのインタラクティブ分析データウェアハウスです。MaxCompute で Hologres 外部テーブルを作成することで、PostgreSQL JDBC ドライバーと STS 認証情報 を使用して Hologres データソースからデータをクエリできます。この方法では、冗長なストレージやデータのインポート/エクスポートなしで直接データをクエリできるため、クエリ結果を迅速に取得できます。
適用範囲
データ操作 (DML)
MaxCompute は Hologres 外部テーブルに対する `UPDATE` または `DELETE` 操作をサポートしていません。
`INSERT OVERWRITE` 操作は Hologres 外部テーブルではサポートされていません。
MaxCompute のデータで Hologres のデータを上書きするには、Hologres の `INSERT OVERWRITE` セマンティクスを使用できます。Hologres から、MaxCompute テーブルにマッピングされた外部テーブルを読み取ることができます。詳細については、「INSERT OVERWRITE」をご参照ください。
データ書き込みのリスク
Hologres 外部テーブルに大量のデータを書き込む場合、複数のプロセスが並行してデータを書き込みます。まれに、書き込みプロセスがデータを再書き込みし、データの重複を引き起こす可能性があります。
パーティション
Hologres のパーティションテーブルは、MaxCompute のパーティションテーブルに直接マッピングされません。Hologres 外部テーブルはパーティションをサポートしていません。ただし、直接読み取りモードを使用して、Hologres のパーティション化された親テーブルにマッピングされた MaxCompute 外部テーブルをクエリする場合、クエリ条件に子テーブルのパーティションキー列が含まれていると、パーティションプルーニングがトリガーされることがあります。
Hologres 外部テーブルはクラスタープロパティをサポートしていません。
Hologres 外部テーブルは Hologres の動的テーブルにマッピングできません。
サポートされているデータ型
DECIMAL 型の制限:
MaxCompute で作成された Hologres 外部テーブルでは、
DECIMALデータ型はデフォルトでdecimal(38,18)に固定されており、変更できません。ソーステーブルの精度が低い場合は、MaxCompute 外部テーブルで列をSTRING型として定義できます。その後、CAST関数を使用して、列をクエリする際に型を変換できます。複雑なデータ型の制限:
MaxCompute で作成された Hologres 外部テーブルは、
Array、Map、Structなどの複雑なデータ型をサポートしていません。その他の互換性のない型:
Hologres の
MONEYなどのデータ型は、MaxCompute に対応するデータ型がなく、サポートされていません。
以下の表に詳細を示します:
Hologres データ型 | MaxCompute データ型 | JDBC 読み取り | JDBC 書き込み | 直接読み取り (odps.table.api.enable.holo.table=true) | 説明 |
INTEGER (エイリアス: INT または INT4) | INT |
|
|
| 32 ビット符号付き整数。 |
TEXT | STRING, VARCHAR |
|
|
| 文字列型。現在の長さ制限は 8 MB です。 |
SMALLINT | SMALLINT |
|
|
| 16 ビット符号付き整数。 |
INT2 | SMALLINT |
|
|
| 16 ビット符号付き整数。 |
BIGINT (エイリアス: INT8) | BIGINT |
|
|
| 64 ビット符号付き整数。 |
BYTEA | BINARY |
|
|
| バイナリデータ型。現在の長さ制限は 8 MB です。Hologres の |
REAL (エイリアス: FLOAT4) | FLOAT |
|
|
| 32 ビットバイナリ浮動小数点型。 |
DOUBLE PRECISION (エイリアス: FLOAT8) | DOUBLE |
|
|
| 64 ビットバイナリ浮動小数点型。 |
BOOLEAN (エイリアス: BOOL) | BOOLEAN |
|
|
| BOOLEAN 型。 |
TIMESTAMP | TIMESTAMP_NTZ |
|
|
| ストレージの精度はナノ秒です。タイムゾーンエラーが発生する可能性があります。 Hologres の TIMESTAMP 型にはタイムゾーンが含まれず、マイクロ秒のストレージ精度を持ちます。 |
TIMESTAMP WITH TIME ZONE (エイリアス: TIMESTAMPTZ) | TIMESTAMP |
|
|
| ナノ秒精度のタイムスタンプ型。フォーマットは MaxCompute と Hologres は、基盤レイヤーで精度の変換を実行します。MaxCompute の出力にはタイムゾーン形式は含まれません。 |
DECIMAL (エイリアス: NUMERIC) | DECIMAL(precision,scale) |
|
|
| 10 進数の正確な数値型。
MaxCompute で DECIMAL 型の精度を指定しない場合、デフォルトは |
CHAR(n) | CHAR(n) |
|
|
| MaxCompute では、 Hologres の |
VARCHAR(n) | VARCHAR(n) |
|
|
| MaxCompute では、 Hologres の |
DATE | DATE |
|
|
| 日付型。フォーマットは |
INT4[] | ARRAY<INT> |
|
|
| 複雑なデータ型 ARRAY。 |
INT8[] | ARRAY<BIGINT> |
|
|
| |
FLOAT4[] | ARRAY<FLOAT> |
|
|
| |
FLOAT8[] | ARRAY<DOUBLE> |
|
|
| |
BOOLEAN[] | ARRAY<BOOLEAN> |
|
|
| |
TEXT[] | ARRAY<STRING> |
|
|
| |
JSONB | JSON |
|
|
| 複雑なデータ型 JSON。直接読み取りモードでサポートされています。 |
JSON | STRING |
|
|
| 文字列型。現在の長さ制限は 8 MB です。JDBC モードは Hologres の JSON 型をサポートしています。 |
SERIAL (自動増分シーケンス) | INT |
|
|
| Hologres の自動増分シーケンスフィールドについては、MaxCompute の INT 型を使用してデータを受け取ることができます。ただし、データ書き込み時には自動増分機能は利用できません。 |
RoaringBitmap | サポートされていません |
|
|
| MaxCompute に対応する型はありません。 |
RoaringBitmap64 | サポートされていません |
|
|
| MaxCompute に対応する型はありません。 |
BIT(n) | サポートされていません |
|
|
| MaxCompute に対応する型はありません。 |
VARBIT(n) | サポートされていません |
|
|
| MaxCompute に対応する型はありません。 |
INTERVAL | サポートされていません |
|
|
| MaxCompute に対応する型はありません。 |
TIMETZ | サポートされていません |
|
|
| MaxCompute に対応する型はありません。 |
TIME | サポートされていません |
|
|
| MaxCompute に対応する型はありません。 |
INET | サポートされていません |
|
|
| MaxCompute に対応する型はありません。 |
MONEY | サポートされていません |
|
|
| MaxCompute に対応する型はありません。 |
OID | サポートされていません |
|
|
| MaxCompute に対応する型はありません。 |
UUID | サポートされていません |
|
|
| MaxCompute に対応する型はありません。 |
Hologres 外部テーブルの作成
Hologres 外部テーブルは、STS モードまたはデュアル署名モードで作成できます。
注意事項
外部テーブル作成の仕様
Hologres の IP アドレスホワイトリスト機能を有効にする場合は、Hologres 外部テーブルをデュアル署名モードで作成してください。STS モードでテーブルを作成すると、MaxCompute から Hologres へのアクセスが IP アドレスホワイトリストによってブロックされます。
`CREATE EXTERNAL TABLE` ステートメントでテーブル名を指定することで、Hologres の親テーブルと子テーブルの両方を MaxCompute 外部テーブルにマッピングできます。ただし、親テーブルは読み取り専用です。
Hologres 外部テーブルにデータを書き込む際、Hologres の INSERT ON CONFLICT (UPSERT) メカニズムはサポートされていません。Hologres ソーステーブルにプライマリキーがある場合は、書き込むデータがソーステーブルのプライマリキーと競合しないようにしてください。
テーブル名とフィールド名では大文字と小文字が区別されません。テーブルやフィールドを作成またはクエリする際に、大文字と小文字の変換を強制することはできません。
スキーマの互換性
Hologres ソーステーブルのスキーマが外部テーブルのスキーマと一致しない場合:
列数が一致しない場合:Hologres ソーステーブルの列数が外部テーブル DDL より少ない場合、Hologres テーブルからデータを読み取る際にエラーが報告されます。例:
column "xxx" does not exist。Hologres ソーステーブルの列数が外部テーブル DDL より多い場合、余分な列は無視されます。列の型が一致しない場合:MaxCompute は、Hologres ソーステーブルの STRING 列に INT 型をマッピングすることをサポートしていません。STRING 型を使用して INT 列にマッピングすることは可能ですが、推奨されません。
構文
外部テーブルを作成する際には、`CREATE EXTERNAL TABLE` DDL ステートメントで StorageHandler を指定する必要があります。また、STS 認証情報 (またはデュアル署名モード) と Hologres データソースの JDBC エンドポイントを設定する必要があります。
Hologres 外部テーブルを STS モードで作成
サンプルコードについては、「Hologres 外部テーブルの作成 (STS モード)」をご参照ください。
CREATE EXTERNAL TABLE [IF NOT EXISTS] <table_name>(
<col1_name> <data_type>,
<col2_name> <data_type>,
......
)
stored BY 'com.aliyun.odps.jdbc.JdbcStorageHandler'
WITH serdeproperties (
'odps.properties.rolearn'='<ram_arn>')
location '<jdbc:postgresql://<endpoint>:<port>/<database>?ApplicationName=MaxCompute&[currentSchema=<schema>&][useSSL={true|false}&]table=<holo_table_name>/>'
tblproperties (
'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
'odps.federation.jdbc.target.db.type'='holo',
'odps.federation.jdbc.colmapping'='<table_column1>:<source_column1>, <table_column2>:<source_column2>,...'
);Hologres 外部テーブルをデュアル署名モードで作成
サンプルコードについては、「Hologres 外部テーブルの作成 (デュアル署名モード)」をご参照ください。
デュアル署名の Hologres 外部テーブルを使用すると、同じ RAM ユーザーが手動での権限付与なしに MaxCompute と Hologres の権限のあるテーブルにアクセスできます。このモードは Hologres の IP アドレスホワイトリスト機能もサポートしており、セキュリティ設定を簡素化します。
-- デュアル署名スイッチを有効にします。
SET odps.sql.common.table.planner.ext.hive.bridge=true;
-- 外部テーブルを作成します。
CREATE EXTERNAL TABLE [IF NOT EXISTS] <table_name>(
<col1_name> <data_type>,
<col2_name> <data_type>,
......
)
STORED BY '<com.aliyun.odps.jdbc.JdbcStorageHandler>'
LOCATION '<jdbc:postgresql://<endpoint>:<port>/<database>?ApplicationName=MaxCompute&[currentSchema=<schema>&][useSSL={true|false}&]table=<holo_table_name>/>'
tblproperties (
'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver',
'odps.federation.jdbc.target.db.type'='holo',
['odps.federation.jdbc.colmapping'='<table_column1>:<source_column1>, <table_column2>:<source_column2>,...']
);パラメーター
パラメーター | 必須 | 説明 |
odps.sql.common.table.planner.ext.hive.bridge | はい | Hologres 外部テーブルをデュアル署名モードで作成するかどうかを指定します。値を |
いいえ | Hologres 外部テーブルを STS モードで作成する場合、このパラメーターを指定する必要はありません。 | |
IF NOT EXISTS | いいえ |
|
table_name | はい | MaxCompute で作成する Hologres 外部テーブルの名前。 |
col_name | はい | Hologres 外部テーブルの列の名前。 |
data_type | はい | Hologres 外部テーブルの列のデータ型。 |
STORED BY | はい | Hologres 外部テーブルのクエリ方法を定義する StorageHandler を指定します。 値は |
ram_arn | はい | Hologres 外部テーブルを STS モードで作成する場合に必須です。外部テーブル作成時の STS 認証用の RAM ロールの ARN を指定します。
|
いいえ | Hologres 外部テーブルをデュアル署名モードで作成する場合、このパラメーターを指定する必要はありません。 | |
LOCATION | はい | Hologres インスタンスの JDBC エンドポイント。以下のパラメーターが含まれます:
|
tblproperties | はい |
|
例
データの準備
すでに Hologres データベース、Hologres テーブル、およびテストデータがある場合は、このステップをスキップできます。
Hologres データベースの作成
Hologres 管理コンソールにログインし、左上のコーナーでリージョンを選択します。
左側のナビゲーションウィンドウで、[インスタンス]を選択します。
インスタンスがない場合は、まず Hologres インスタンスを購入する必要があります。
[インスタンス] ページで、対象のインスタンス名をクリックします。
インスタンス詳細ページで、[インスタンスに接続] をクリックします。
上部にある[メタデータ管理]タブをクリックします。
データベースの作成をクリックします。表示されるダイアログボックスで、データベース名を入力し、他のパラメーターはデフォルト設定のままにします。
Hologres テーブルの作成
インスタンス詳細ページで、[インスタンスに接続] をクリックします。
上部にある [SQL Editor] タブをクリックします。
次のステートメントを入力します:
CREATE TABLE IF NOT EXISTS holo ( id INT PRIMARY KEY, name TEXT ); INSERT INTO holo (id, name) VALUES (1, 'kate'), (2, 'mary'), (3, 'bob'), (4, 'tom'), (5, 'lulu'), (6, 'mark'), (7, 'haward'), (8, 'lilei'), (9, 'hanmeimei'), (10, 'lily'), (11, 'lucy'); SELECT * FROM holo ORDER BY id;
Hologres 外部テーブルの作成 (STS モード)
前提条件
Hologres 外部テーブルを作成するための宛先 MaxCompute プロジェクトが利用可能であること。
MaxCompute プロジェクトの作成方法については、「MaxCompute プロジェクトの作成」をご参照ください。
RAM ロールの作成と権限付与
Hologres は、異なる Alibaba Cloud アカウントの RAM ロールをデータベースインスタンスに追加することをサポートしていません。したがって、STS モードでは、Hologres は同じアカウントに属する RAM ロールのみの権限付与をサポートします。
同様に、MaxCompute が Hologres 外部テーブルまたは外部スキーマにアクセスする場合、同じアカウントの RAM ロールのみがサポートされます。
RAM ロールの作成
RAM ロールを作成して、その ARN を取得します。ARN は、外部テーブルを作成する際の STS 認証に使用されます。必要に応じて、RAM ロールの信頼できるエンティティタイプを選択します。この例では、信頼できるエンティティは Alibaba Cloud アカウントです。
Alibaba Cloud アカウント:Alibaba Cloud アカウント配下の RAM ユーザーは、RAM ロールを偽装してクラウドリソースにアクセスできます。詳細については、「信頼できる Alibaba Cloud アカウントの RAM ロールを作成する」をご参照ください。
ID プロバイダー:オンプレミスの ID システムから Alibaba Cloud 管理コンソールにログインするためのシングルサインオン (SSO) を設定できます。これは、統一されたユーザーログイン認証を必要とする企業に役立ちます。詳細については、「信頼できる IdP の RAM ロールを作成する」をご参照ください。
次のステップを実行します:
左側のナビゲーションウィンドウで、 を選択します。
[ロール] ページで、[ロールの作成] をクリックします。
[ロールの作成] ページで、[プリンシパルタイプ] を [クラウドアカウント] に設定します。
信頼ポリシーの変更
[ロール] ページで、対象の [ロール名] をクリックすると、その詳細ページが開きます。
[信頼ポリシー] タブで、[信頼ポリシーの編集] をクリックします。[信頼ポリシーの編集] ページで、[JSON] タブをクリックします。
次の内容で信頼ポリシーを変更します。
次の内容に基づいて信頼ポリシーを変更します。信頼ポリシーの設定は、選択した信頼できるエンティティのタイプによって異なります。ポリシー内の
<UID>は Alibaba Cloud アカウント ID であり、ユーザー情報ページで確認できます。信頼できるエンティティタイプが Alibaba Cloud アカウントの場合
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::<UID>:root" ] } }, { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "<UID>@odps.aliyuncs.com" ] } } ], "Version": "1" }信頼できるエンティティタイプが ID プロバイダーの場合
{ "Statement": [ { "Action": "sts:AssumeRole", "Condition": { "StringEquals": { "saml:recipient": "https://signin.aliyun.com/saml-role/sso" } }, "Effect": "Allow", "Principal": { "Federated": [ "acs:ram::<UID>:saml-provider/IDP" ] } }, { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "<UID>@odps.aliyuncs.com" ] } } ], "Version": "1" }
RAM ロールを Hologres インスタンスに追加し、権限を付与する
RAM ロールには、Hologres インスタンスに対する開発者権限が必要です。デフォルトでは、RAM ロールは Hologres コンソールでインスタンスを表示または操作できません。そのため、Alibaba Cloud アカウントが RAM ロールに必要な権限を付与する必要があります。次のいずれかの方法で、RAM ロールを Hologres インスタンスに追加し、権限を付与できます:
Hologres コンソールで権限を付与する
Hologres 管理コンソールにログインし、左上のコーナーでリージョンを選択します。
左側のナビゲーションウィンドウで、[インスタンス]を選択します。
[インスタンス] ページで、対象のインスタンス名をクリックします。
インスタンス詳細ページで、[インスタンスに接続] をクリックします。
上の [セキュリティセンター] タブをクリックします。
左側のナビゲーションウィンドウで、[ユーザー管理]を選択します。
[データベース権限付与] タブで、インスタンスの RAM ロールに開発者権限を付与します。
データベースのアクセスポリシーがエキスパートモードに設定されている場合は、ユーザー管理ページでロールタイプを SuperUser に変更する必要があります。この変更後、データベース権限を個別に付与する必要はありません。
RAM コンソールで権限を付与する
RAM ユーザーが RAM ロールを偽装する場合、デフォルトでは RAM ユーザーは Hologres コンソールに対する権限を持ちません。Alibaba Cloud アカウントは、RAM コンソールで RAM ユーザーに AliyunRAMReadOnlyAccess 権限を付与する必要があります。そうしないと、RAM ユーザーは Hologres コンソールでいかなる操作も実行できません。詳細については、「RAM ユーザーに権限を付与する」をご参照ください。
左側のナビゲーションウィンドウで、を選択します。
[ロール] ページで、対象の [ロール名] の [アクション] 列にある [権限の付与] をクリックします。
AliyunRAMReadOnlyAccess ポリシーを選択して、現在のロールに権限を付与します。
SQL ステートメントを使用して権限を付与する
SQL ステートメントを使用して権限を付与する方法については、「Hologres 権限モデル」をご参照ください。
MaxCompute で外部テーブルを作成する
MaxCompute クライアントにログインし、宛先の MaxCompute プロジェクトに切り替えます。
次のコマンドを実行して、Hologres 外部テーブルを作成します。
「データの準備」ステップで準備した Hologres インスタンス情報は次のとおりです:
Hologres データベース名:
holo_external_test。Hologres データベーススキーマ:
public。Hologres テーブル名:
holo。Hologres データベースのクラシックネットワークエンドポイント:
hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80。
CREATE EXTERNAL TABLE IF NOT EXISTS my_table_holo_jdbc ( id bigint, name string ) stored BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::139699392458****:role/<role name>') location 'jdbc:postgresql://hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80/<holo database name>?ApplicationName=MaxCompute¤tSchema=public&useSSL=true&table=<table name>/' tblproperties ( 'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 'odps.federation.jdbc.target.db.type'='holo', 'odps.federation.jdbc.colmapping'='id:id,name:name' );次のコマンドを実行して、新しく作成した Hologres 外部テーブルを使用して Hologres ソーステーブル情報をクエリします。
-- Hologres 外部テーブルにアクセスするために、次のプロパティを追加します。 SET odps.sql.split.hive.bridge=true; SET odps.sql.hive.compatible=true; SET odps.table.api.enable.holo.table=true; -- JDBC 直接読み取りモードを有効にします。 -- Hologres 外部テーブルからデータをクエリします。 SELECT * FROM my_table_holo_jdbc limit 10; -- 次の結果が返されます。 +------------+------------+ | id | name | +------------+------------+ | 9 | hanmeimei | | 4 | tom | | 7 | haward | | 2 | mary | | 5 | lulu | | 8 | lilei | | 10 | lily | | 1 | kate | | 6 | mark | | 11 | lucy | +------------+------------+Hologres 外部テーブルを使用して、Hologres とのデータ交換および共同分析を実行します。
MaxCompute で処理されたデータを外部テーブルを使用して Hologres に書き込み、分析とオンラインサービスを高速化できます。次のサンプルコマンドに例を示します。
-- Hologres 外部テーブルにアクセスするために、次のプロパティを追加します。 SET odps.sql.split.hive.bridge=true; SET odps.sql.hive.compatible=true; SET odps.table.api.enable.holo.table=true; -- JDBC 直接読み取りモードを有効にします。 -- Hologres 外部テーブルにデータを挿入します。 INSERT INTO my_table_holo_jdbc VALUES (12,'alice'); -- Hologres 外部テーブルからデータをクエリします。 SELECT * FROM my_table_holo_jdbc; -- 次の結果が返されます。 +------------+------------+ | id | name | +------------+------------+ | 9 | hanmeimei | | 4 | tom | | 7 | haward | | 2 | mary | | 5 | lulu | | 12 | alice | | 8 | lilei | | 10 | lily | | 1 | kate | | 11 | lucy | | 6 | mark | | 3 | bob | +------------+------------+頻繁に更新されるディメンションテーブルを Hologres に保存して、リアルタイムの更新要件を満たすことができます。その後、MaxCompute は外部テーブルを使用してこれらのディメンションテーブルにアクセスし、MaxCompute に保存されているファクトテーブルとの関連分析を実行できます。次のサンプルコマンドに例を示します。
-- Hologres 外部テーブルにアクセスするために、次のプロパティを追加します。 SET odps.sql.split.hive.bridge=true; SET odps.sql.hive.compatible=true; -- MaxCompute 内部テーブルを作成します。 CREATE TABLE holo_test AS SELECT * FROM my_table_holo_jdbc; -- MaxCompute 内部テーブルと Hologres 外部テーブルの関連分析を実行します。 SELECT * FROM my_table_holo_jdbc t1 INNER JOIN holo_test t2 ON t1.id=t2.id; -- 次の結果が返されます。 +------------+------------+------------+------------+ | id | name | id2 | name2 | +------------+------------+------------+------------+ | 9 | hanmeimei | 9 | hanmeimei | | 4 | tom | 4 | tom | | 7 | haward | 7 | haward | | 2 | mary | 2 | mary | | 5 | lulu | 5 | lulu | | 12 | alice | 12 | alice | | 8 | lilei | 8 | lilei | | 10 | lily | 10 | lily | | 1 | kate | 1 | kate | | 11 | lucy | 11 | lucy | | 6 | mark | 6 | mark | | 3 | bob | 3 | bob | +------------+------------+------------+------------+
Hologres 外部テーブルの作成 (デュアル署名モード)
デュアル署名は、MaxCompute と Hologres が共同で開発した認証および権限付与プロトコルです。MaxCompute 側でログイン情報が署名された後、認証データが Hologres 側に渡されます。Hologres は、MaxCompute と合意した基盤プロトコルに基づいて認証と権限付与を実行します。これにより、MaxCompute と Hologres の両方で同じアカウント名を持つユーザーが、追加の認証設定なしで外部テーブルにアクセスできます。
前提条件
Hologres 外部テーブルを作成するための宛先 MaxCompute プロジェクトが利用可能であること。
MaxCompute プロジェクトの作成方法については、「MaxCompute プロジェクトの作成」をご参照ください。
MaxCompute アカウントと同じ名前のアカウントが Hologres に存在し、このアカウントが Hologres の対応するテーブルに対する読み取りおよび書き込み権限を持っていること。
Hologres V1.3 以降のみが、MaxCompute でのデュアル署名モードでの Hologres 外部テーブルの作成をサポートしています。現在、デュアル署名モードは Hologres 外部テーブルからのデータ読み取りのみをサポートしており、データ書き込みはサポートしていません。
MaxCompute で外部テーブルを作成する
MaxCompute クライアントにログインし、宛先の MaxCompute プロジェクトに切り替えます。
次のコマンドを実行して、Hologres 外部テーブルを作成します。
「データの準備」ステップで準備した Hologres インスタンス情報は次のとおりです:
Hologres データベース名:
holo_external_test。Hologres データベーススキーマ:
public。Hologres テーブル名:
holo。Hologres データベースのクラシックネットワークエンドポイント:
hgprecn-cn-oew210ut****-cn-hangzhou-internal.hologres.aliyuncs.com:80。
-- 外部テーブルを作成します。 CREATE EXTERNAL TABLE IF NOT EXISTS holo_mc_external_dbl ( id int, name string ) STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' location 'jdbc:postgresql://hgpostcn-cn-****-cn-hangzhou-internal.hologres.aliyuncs.com:80/<holo database name>?ApplicationName=MaxCompute¤tSchema=public&preferQueryMode=simple&useSSL=false&table=<table name>/' TBLPROPERTIES ( 'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 'odps.federation.jdbc.target.db.type'='holo', 'odps.federation.jdbc.colmapping'='id:id,name:name' );外部テーブルをクエリします。
-- 外部テーブルをクエリします (デュアル署名スイッチを有効にするコマンドと一緒に実行する必要があります)。 SET odps.sql.common.table.planner.ext.hive.bridge=true; SELECT * FROM holo_mc_external_dbl; -- 次の結果が返されます。 +------------+------------+ | id | name | +------------+------------+ | 9 | hanmeimei | | 4 | tom | | 7 | haward | | 2 | mary | | 5 | lulu | | 12 | alice | | 8 | lilei | | 10 | lily | | 1 | kate | | 11 | lucy | | 6 | mark | | 3 | bob | +------------+------------+
Hologres 外部テーブルの直接読み取り機能を有効にする
MaxCompute は JDBC モードで Hologres 外部テーブルからデータを読み取ります。MaxCompute は Hologres ストレージレイヤーからの直接読み取りもサポートしており、以下の利点があります:
テーブルの読み取りレイテンシを大幅に削減し、データクエリの速度を向上させます。
Hologres フロントエンド (FE) への接続数を大幅に削減します。ほとんどのクエリは 1 つの接続のみを必要とします。
制限
Hologres 直接読み取りモードが有効な場合、以下の制限が適用されます。条件が満たされない場合、システムは JDBC モードにフォールバックします。
バージョン要件
Hologres インスタンスは V1.3.34 以降である必要があります。V1.3.34 より前のバージョンは直接読み取り機能をサポートしていません。
テーブルタイプの制限
Hologres コールドストレージテーブルの直接読み取りはサポートされていません。
Hologres 行指向テーブルの直接読み取りはサポートされていません。
データ型マッピングの制限
MaxCompute が直接読み取りモードで Hologres の Timestamp With Time Zone 型をマッピングするために Timestamp 型を使用する場合、わずかな時間エラーが発生する可能性があります。具体的な違いは次のとおりです:
時間値のエラー
Hologres の Timestamp With Time Zone 列の時刻が
1900-12-31 15:54:15より前の場合、MaxCompute がクエリする時刻は 5 分 44 秒進みます。Hologres の Timestamp With Time Zone 列の時刻が
1900-12-31 15:54:16から1969-12-31 23:59:58の間の場合、MaxCompute がクエリする時刻は 1 秒進みます。Hologres の Timestamp With Time Zone 列の時刻が
1969-12-31 23:59:59以降の場合、MaxCompute がクエリする時刻は Hologres の時刻と同じです。
タイムゾーンのオフセット
MaxCompute のタイムゾーンが UTC+8 で、Hologres の Timestamp With Time Zone 列の時刻が
2000-01-01 00:00:00の場合、MaxCompute がクエリする時刻は2000-01-01 08:00:00です。MaxCompute のタイムゾーンが UTC+8 で、Hologres の Timestamp With Time Zone 列の時刻が
1969-01-01 00:00:00の場合、MaxCompute がクエリする時刻は1969-01-01 08:00:01です。
同一リージョン制限
ネットワーク接続の制限により、MaxCompute は同じリージョン内の Hologres インスタンスにのみアクセスできます。リージョン間のアクセスはエラーになります:
FAILED: ODPS-0010000:System internal error - fuxi job failed, caused by: Pangu request failed with error code 3。Hologres がプライマリ/セカンダリ アーキテクチャで構成されている場合、プライマリインスタンスの接続 URL のみ設定できます。セカンダリインスタンスはサポートされていません。
Foreign Server モードの追加制限:MaxCompute プロジェクトでスキーマレベルの構文スイッチを有効にする必要があります。
有効化方法
MaxCompute で Hologres 外部テーブルをクエリする際に、SQL ステートメントの前に次のパラメーターを追加します。
SET odps.table.api.enable.holo.table=true;プロジェクトレベルの直接読み取りスイッチを設定します。
-- 直接読み取りスイッチと JDBC へのフォールバックを無効にするスイッチは、両方ともプロジェクトレベルで設定できます。
-- プロジェクトレベルで直接読み取りスイッチを有効にする:
setproject odps.table.api.enable.holo.table=true; --true で有効化 | false で無効化
-- デフォルトの JDBC へのフォールバックを無効にする:
setproject odps.table.api.allow.fallback.jdbc=false; --true でフォールバック | false でフォールバックしない直接読み取りを確認する
Logview のログを確認することで、クエリが直接読み取りモードを使用したかどうかを判断できます。Logview の使用方法の詳細については、「Logview 2.0 を使用してジョブの実行情報を表示する」をご参照ください。
Logview の サマリータブで、external holo tables フィールドを見つけて、そのプロパティを表示します。プロパティのフォーマットは次のとおりです:
<project_name>.<table_name>:<access_mode>[<(fallback_reason)>]パラメーター:
パラメーター | 説明 |
project_name | プロジェクト名。 |
table_name | テーブル名。 |
アクセスモード | 外部テーブルのアクセスモード。有効値:
|
フォールバック理由 | アクセスモードが
|
直接読み取りモードで実行されているタスクは、直接読み取りの制限に遭遇すると JDBC モードにフォールバックする可能性があります。ビジネス負荷が高い場合、このフォールバックは多くの Hologres 接続プールリソースを消費する可能性があります。さらに、JDBC モードのデータ転送効率は直接読み取りモードよりもはるかに低く、リソースの解放も遅くなります。
JDBC モードへのフォールバックは Hologres インスタンスに負荷をかける可能性があることに注意してください。極端な場合、多くのフォールバックジョブが Hologres インスタンスにアクセスする他のサービスに影響を与える可能性があります。これを防ぐには、実行パラメーター set odps.table.api.allow.fallback.jdbc=false; を直接読み取りタスクに追加して自動フォールバックを無効にし、予期しない影響を回避できます。
Hologres データのインポートとエクスポート
よくある質問
MaxCompute から Hologres データを直接読み取る際に発生する ODPS-0130071 エラーを解決するにはどうすればよいですか?
症状
Hologres データを直接読み取る際に、エラー
ODPS-0130071 Failed to split to equal size...max count: 7777が報告されます。例:ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: storage/table/src/input_splits_builder.cpp(195): StorageException: Failed to split to equal size, total size: 2143570729934, min size: 268435456, max size: 272629760, max count: 7777, split size: 275629513, split count: 7777原因
MaxCompute が Hologres からデータを直接読み取る際、デフォルトの Mapper 分割ポリシー (入力データ量 / split.size 256 MB) を使用します。これにより、ジョブによって生成される Mapper タスクの数が最大制限の 7777 を超えてしまいます。
説明この制限は、ユーザーが多数の Mapper タスクを生成するジョブを送信し、Hologres ファイルやネットワーク接続の安定性に影響を与えることを防ぐためのものです。
解決策
次のパラメーターを設定してエラーを解決できます。
SET odps.external.holo.mapper.instances=10000; -- 並行処理の上限を増やします。最大値は 10000 です。 SET odps.sql.mapper.split.size=512; -- タスクの並行処理を調整します。最大値は 512 MB です。
Hologres 外部テーブルで実行される SQL ジョブが遅いのはなぜですか?また、どうすれば修正できますか?
SDK を使用すると、MaxCompute 外部テーブルでのクエリが遅くなります。
症状
SDK を使用して MaxCompute 外部テーブルをクエリする SQL ジョブの実行が遅い。
解決策
外部テーブルは全表スキャンのみをサポートしているため、処理が遅くなります。代わりに MaxCompute 内部テーブルを使用することを推奨します。
Hologres でキーワードが列名として使用された場合に発生するエラーを解決するにはどうすればよいですか?
症状
Hologres でキーワードが特別な設定なしに列名として使用されると、次のエラーが発生します:
ODPS-0123131:User defined function exception - SQLException in nextKeyValueCaused by: org.postgresql.util.PSQLException: ERROR: syntax error at or near ","解決策
odps.federation.jdbc.colmappingパラメーターを追加して、Hologres ソーステーブルと Hologres 外部テーブルの間のフィールドをマッピングします。たとえば、Hologres ソーステーブルにキーワードフィールド
"offset"が含まれている場合、Hologres 外部テーブルを作成するときにパラメーター'odps.federation.jdbc.colmapping'='offset:"offset"'を追加する必要があります。
参考資料
Hologres 外部テーブルに関するよくある質問への回答については、「データレイクハウス/外部テーブル FAQ」をご参照ください。

