このトピックでは、CREATE TABLE 文で Hologres データソース、権限付与方法 (STS 認証またはサービスリンクロール)、ターゲットテーブル、および JDBC ドライバー情報を指定して、Hologres 外部テーブルを作成する方法について説明します。
概要
Hologres は、PostgreSQL プロトコルと互換性があり、MaxCompute とシームレスに統合されるリアルタイムインタラクティブ分析データウェアハウスです。MaxCompute で Hologres 外部テーブルを作成して、PostgreSQL JDBC ドライバーと STS 認証 を使用して Hologres データソースをクエリできます。この方法では、冗長なストレージが不要になり、データのインポートやエクスポートが不要で、高速なクエリ結果が得られます。
制限事項
データ操作 (DML)
MaxCompute は、Hologres 外部テーブルに対する
UPDATEまたはDELETE操作をサポートしていません。Hologres 外部テーブルは
INSERT OVERWRITE文をサポートしていません。MaxCompute のデータで Hologres テーブルのデータを上書きするには、Hologres で
INSERT OVERWRITE文を実行します。この文は、MaxCompute テーブルにマッピングされた Hologres の外部テーブルからデータを読み取ります。詳細については、「INSERT OVERWRITE」をご参照ください。
データ書き込みリスク
Hologres 外部テーブルに大量のデータを書き込む場合、並列書き込みプロセスが使用されます。まれに、これらのプロセスの 1 つがデータを再書き込みし、データが重複する可能性があります。
パーティション
Hologres と MaxCompute のパーティションテーブルは、互いに直接マッピングされません。Hologres 外部テーブルはパーティションをサポートしていません。ただし、直接読み取りモードでは、Hologres パーティション親テーブルにマッピングされた Hologres 外部テーブルをクエリする場合、クエリフィルターに基になるパーティション化された子テーブルのパーティション列に関する条件が含まれていると、パーティションプルーニングが適用されます。
Hologres 外部テーブルは
cluster属性をサポートしていません。Hologres 外部テーブルは、Hologres Dynamic Table へのマッピングをサポートしていません。
サポートされるデータ型のリストをご参照ください。
Hologres 外部テーブルの作成
Hologres の RAM ロール権限付与 (STS モード) または サービスリンクロール権限付与モード (ダブル署名モード) のいずれかを使用して Hologres 外部テーブルを作成できます。
注意事項
外部テーブル作成のガイドライン
ご利用の Hologres インスタンスが外部アクセスに IP ホワイトリストを使用している場合は、サポートされているバージョンにアップグレードしてください:
RAM ロール権限付与モードの場合、Hologres V3.2 以降にアップグレードしてください。
サービスリンクロール権限付与モードの場合、Hologres V2.0.28 以降にアップグレードしてください。
アップグレード後、Hologres は MaxCompute サービス ID またはサービスリンクロールに基づいて MaxCompute ノード IP を自動的に信頼します。ご利用の Hologres インスタンスの IP ホワイトリストに MaxCompute エラスティックノードの IP アドレスを追加する必要はなくなります。
Hologres の親テーブルと子テーブルの両方を外部テーブルにマッピングできます。ただし、親テーブルにマッピングされた外部テーブルからは読み取りのみ可能で、書き込みはできません。
Hologres 外部テーブルにデータを書き込む場合、INSERT ON CONFLICT (UPSERT) メカニズムはサポートされていません。Hologres ソーステーブルにプライマリキーがある場合は、プライマリキーの競合を引き起こすデータの書き込みを避けてください。
テーブル名と列名では大文字と小文字が区別されません。テーブルと列を作成またはクエリする際に、大文字と小文字の区別を強制することはできません。
スキーマの互換性
Hologres ソーステーブルのスキーマが外部テーブルのスキーマと一致しない場合は、次の点にご注意ください:
列数の不一致:ソーステーブルの列数が外部テーブルより少ない場合、
column "xxx" does not existのようなエラーでデータ読み取りが失敗します。ソーステーブルの列数が外部テーブルより多い場合、余分な列は無視されます。列の型の不一致:MaxCompute は、Hologres ソーステーブルの
STRING型の列を外部テーブルのINT型の列にマッピングできません。INT型の列をSTRING型の列にマッピングすることはサポートされていますが、推奨されません。
構文
外部テーブルを作成する際には、DDL 文で StorageHandler を指定し、Hologres データソースにアクセスするための JDBC 接続文字列と STS 認証情報 (またはサービスリンクロール権限付与モードを有効にする) を設定する必要があります。
RAM ロールモード
完全なコードサンプルについては、「Hologres 外部テーブルの作成 (RAM ロール権限付与モード)」をご参照ください。
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 外部テーブルの作成 (サービスリンクロール権限付与モード)」をご参照ください。
サービスリンクロール権限付与モードでは、同じ RAM ユーザーが手動での権限付与を必要とせずに、MaxCompute と Hologres の両方で権限のあるテーブルにアクセスできます。このモードは、Hologres の IP ホワイトリスト機能もサポートしており、使用を簡素化します。
-- 外部テーブルの作成
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>,...']
);パラメーター
例
ステップ 1:Hologres データの準備
Hologres データベース、テーブル、およびテストデータがある場合は、このステップをスキップできます。
Hologres データベースの作成
Hologres 管理コンソールにログインします。左上隅でリージョンを選択します。
左側のナビゲーションウィンドウで、Instances をクリックします。
インスタンスがない場合は、まず Hologres インスタンスを購入 する必要があります。
Instances ページで、ターゲットインスタンスの名前をクリックします。
インスタンスの詳細ページで、Connect to Instance をクリックします。
Metadata Management タブをクリックします。
Create Database をクリックし、表示されるダイアログボックスに Database Name を入力し、他のパラメーターはデフォルト設定のままにします。
Hologres テーブルの作成
インスタンスの詳細ページで、Connect to Instance をクリックします。
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;
ステップ 2:Hologres 外部テーブルの作成
RAM ロール
このモードでは、外部テーブルの作成者が、Hologres データへのアクセス権限を持つ RAM ロールを外部テーブル定義に埋め込みます。その後、必要に応じてこの外部テーブルに対する権限を他の MaxCompute ユーザーに付与できます。ユーザーが外部テーブルにアクセスすると、システムはバインドされた RAM ロールを使用して、マッピングされた Hologres テーブルのデータにアクセスします。
Hologres は、クロスアカウントの RAM ロールをデータベースインスタンスに追加することをサポートしていません。したがって、STS モードの Hologres は、同じアカウントの RAM ロールのみをサポートします。同様に、MaxCompute が外部テーブルまたは外部スキーマを使用して Hologres にアクセスする場合も、同じアカウントの RAM ロールのみがサポートされます。
前提条件
Hologres 外部テーブルを作成するターゲットの MaxCompute プロジェクトがあること。
詳細については、「MaxCompute プロジェクトの作成」をご参照ください。
RAM ロールを作成し、権限を付与していること。詳細については、「Hologres の RAM ロールの権限付与」をご参照ください。
MaxCompute での外部テーブルの作成
MaxCompute クライアントにログインし、ターゲットの MaxCompute プロジェクトに切り替えます。
次の文を実行して、Hologres 外部テーブルを作成します。
次の例では、ステップ 1: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 外部テーブルにアクセスするには、以下のプロパティが必要です。 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 データにアクセスするためにサービスリンクロールを作成する必要があります。不正アクセスを防ぐため、このモードはユーザーの ID を Hologres に転送して認証します。したがって、ユーザーは外部テーブルと基になる Hologres テーブルの両方に対する権限を持っている必要があります。
前提条件
Hologres 外部テーブルを作成するターゲットの MaxCompute プロジェクトがあること。
詳細については、「MaxCompute プロジェクトの作成」をご参照ください。
ご利用の MaxCompute アカウントと同じ名前のアカウントが Hologres に存在し、このアカウントがターゲットテーブルに対する読み取りおよび書き込み権限を持っていること。
このサービスリンクロール権限付与モードは、Hologres V1.3 以降でのみサポートされています。現在、このモードは Hologres 外部テーブルからの読み取りのみをサポートしており、書き込みはサポートしていません。
MaxCompute での外部テーブルの作成
MaxCompute クライアントにログインし、ターゲットの MaxCompute プロジェクトに切り替えます。
次の文を実行して、Hologres 外部テーブルを作成します。
次の例では、ステップ 1: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&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' );外部テーブルをクエリします。
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 フロントエンドへの接続数を最小限に抑えます。ほとんどのクエリは単一の接続のみを必要とします。
制限事項
Hologres の直接読み取りモードを有効にすると、次の制限が適用されます。これらの条件が満たされない場合、クエリは JDBC モードにフォールバックします。
バージョン要件
ご利用の Hologres インスタンスは V1.3.34 以降である必要があります。以前のバージョンでは直接読み取り機能はサポートされていません。
テーブルタイプの制限
直接読み取りモードは、Hologres コールドストレージテーブルではサポートされていません。
直接読み取りモードは、Hologres 行指向テーブルではサポートされていません。
データ型マッピングの制限
直接読み取りモードを使用する場合、Hologres のタイムゾーン付きタイムスタンプ型を MaxCompute の TIMESTAMP 型にマッピングすると、わずかな時間の不一致が発生する可能性があります。違いは次のとおりです:
時間の値の不一致
1900-12-31 15:54:15より前のタイムスタンプの場合、MaxCompute が返す時間は 5 分 44 秒進んでいます。1900-12-31 15:54:16から1969-12-31 23:59:58までのタイムスタンプの場合、MaxCompute が返す時間は 1 秒進んでいます。1969-12-31 23:59:59以降のタイムスタンプの場合、Hologres と MaxCompute の時間は同じです。
タイムゾーンオフセット
たとえば、MaxCompute のタイムゾーンが UTC+8 で、Hologres のタイムゾーン付きタイムスタンプ列が
2000-01-01 00:00:00の場合、MaxCompute は2000-01-01 08:00:00を返します。たとえば、MaxCompute のタイムゾーンが UTC+8 で、Hologres のタイムゾーン付きタイムスタンプ列が
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 にはプライマリインスタンスのみを指定でき、セカンダリインスタンスは指定できません。
外部サーバーモードの追加制限:MaxCompute プロジェクトのスキーマレベルの構文スイッチを有効にする必要があります。
直接読み取りモードを有効にする
セッションの直接読み取りモードを有効にするには、MaxCompute で 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 | テーブルの名前。 |
access mode | 外部テーブルのアクセスモード。有効な値:
|
fallback reason | access mode が
|
直接読み取りモードを使用するジョブが制限に遭遇すると、自動的に JDBC モードにフォールバックします。高負荷のワークロード下では、このフォールバックは Hologres 接続プールから大量のリソースを消費する可能性があり、JDBC モードでのデータ転送は直接読み取りモードよりもはるかに非効率です。その結果、これらのリソースはゆっくりと解放され、ご利用の Hologres インスタンスの負荷が増加する可能性があります。
極端な場合、頻繁なフォールバックは、同じ Hologres インスタンスに依存する他のビジネスクリティカルなサービスに影響を与える可能性があります。これを防ぐには、ジョブに set odps.table.api.allow.fallback.jdbc=false; パラメーターを追加して、自動フォールバックメカニズムを無効にすることができます。これにより、ジョブはサイレントにフォールバックする代わりに失敗し、予期しないパフォーマンスの低下を防ぎます。
Hologres 外部テーブルの述語プッシュダウン
MaxCompute で Hologres 外部テーブルをクエリする場合、クエリのフィルター条件を Hologres にプッシュダウンできます。この手法は述語プッシュダウン (PPD) と呼ばれ、ソースでデータをフィルタリングすることで、転送されるデータ量を削減し、クエリパフォーマンスを向上させます。述語プッシュダウンは、特に次のシナリオで効果的です:
大量のデータをフィルタリングする選択的なフィルター条件を持つクエリ。
論理パーティションテーブルに対するクエリ。
注意事項
シナリオ | 説明 |
コアパラメーター |
構文例:
|
サポートされる型 | INT、BIGINT、STRING、DATE、TIMESTAMP、BINARY |
制限事項 |
|
適用シナリオ |
|
例
データを準備します。ご利用の Hologres インスタンスで、テストテーブルを作成し、データを挿入します。
CREATE TABLE test_multi_type_ppd ( c_id INT NOT NULL, c_boolean BOOLEAN, c_int INT, c_bigint BIGINT, c_double DOUBLE precision, c_float REAL, c_string TEXT, c_date DATE, c_timestamp_tz TIMESTAMPTZ, c_timestamp_ntz TIMESTAMP ) WITH (SEGMENT_KEY = 'c_id'); -- 10行のデータを挿入します。 INSERT INTO test_multi_type_ppd VALUES (1, true, 10, 1000, 1.25, 1.5, 'alpha', '2023-01-01', '2023-01-01 10:00:00+08', '2023-01-01 02:00:00'), (2, false, 20, 2000, -2.50, 2.5, 'beta', '2023-01-02', '2023-01-02 10:00:00+08', '2023-01-02 02:00:00'), (3, true, 30, 3000, 3.75, -3.5, 'gamma', '2023-01-03', '2023-01-03 10:00:00+08', '2023-01-03 02:00:00'), (4, false, 40, 4000, 4.00, 4.5, 'delta', '2023-01-04', '2023-01-04 10:00:00+08', '2023-01-04 02:00:00'), (5, true, 50, 5000, 5.50, 5.5, 'epsilon', '2023-01-05', '2023-01-05 10:00:00+08', '2023-01-05 02:00:00'), (6, false, 60, 6000, 6.60, 6.0, 'zeta', '2023-01-06', '2023-01-06 10:00:00+08', '2023-01-06 02:00:00'), (7, true, 70, 7000, 7.70, -7.0, 'eta', '2023-01-07', '2023-01-07 10:00:00+08', '2023-01-07 02:00:00'), (8, false, 80, 8000, 8.80, 8.0, 'theta', '2023-01-08', '2023-01-08 10:00:00+08', '2023-01-08 02:00:00'), (9, true, 90, 9000, -9.90, 9.0, 'iota', '2023-01-09', '2023-01-09 10:00:00+08', '2023-01-09 02:00:00'), (10, false, 100, 10000, 10.10, 10.0, 'kappa', '2023-01-10', '2023-01-10 10:00:00+08', '2023-01-10 02:00:00'); SELECT * FROM test_multi_type_ppd;MaxCompute で Hologres 外部テーブルを作成します。
CREATE EXTERNAL TABLE test_multi_type_ppd ( c_id int, c_boolean boolean, c_int int, c_bigint bigint, c_double double, c_float float, c_string string, c_date date, c_timestamp_tz timestamp, c_timestamp_ntz timestamp_ntz ) STORED BY 'com.aliyun.odps.jdbc.JdbcStorageHandler' LOCATION 'jdbc:postgresql://<holo-endpoint>/<db>?currentSchema=public&table=test_multi_type_ppd' TBLPROPERTIES ( 'mcfed.mapreduce.jdbc.driver.class'='org.postgresql.Driver', 'odps.federation.jdbc.target.db.type'='holo' );外部テーブルをクエリします。
-- Hologres 直接読み取りを有効にします。 SET odps.table.api.enable.holo.table=true; -- PPD モード (off、on、または debug) を設定します。 SET odps.external.holo.read.table.rules="{predicate_pushdown_mode:on}"; -- 型システムを設定します。 SET odps.sql.type.system.odps2=true; SET odps.sql.decimal.odps2=true; -- 式を TableScan にプッシュダウンできるようにします。これは通常、デフォルトで有効になっています。 SET odps.use.builtin.function.input.range=true; -- set odps.mcqa.disable=true; SELECT * FROM test_multi_type_ppd WHERE c_id = 3; -- クエリは次の結果を返します。 +------+-----------+-------+------------+------------+---------+----------+--------+----------------+-----------------+ | c_id | c_boolean | c_int | c_bigint | c_double | c_float | c_string | c_date | c_timestamp_tz | c_timestamp_ntz | +------+-----------+-------+------------+------------+---------+----------+--------+----------------+-----------------+ | 3 | true | 30 | 3000 | 3.75 | -3.5 | gamma | 2023-01-03 | 2023-01-03 10:00:00 | 2023-01-03 02:00:00 | +------+-----------+-------+------------+------------+---------+----------+--------+----------------+-----------------+ -- Logview の概要セクションを確認します。次の情報が表示されます: external holo tables: **.default.test_multi_type_ppd:Optimized Holo-side PPD enabled --> Filter pushdown applied successfully Snapshot Id: 56-1-100*** With-filter file count: 2 With-filter create snapshot duration: 19ms
Hologres データのインポートとエクスポート
サポートされるデータ型
Decimal 型の制限
MaxCompute で作成された Hologres 外部テーブルの場合、
DECIMALデータ型はdecimal(38,18)に固定されており、変更できません。ソーステーブルの小数点以下の桁数が少ない場合は、MaxCompute 外部テーブルで列をSTRING型として定義し、使用時にCAST関数を使用してデータを明示的にキャストできます。複雑なデータ型の制限
MaxCompute で作成された Hologres 外部テーブルは、
Array、Map、またはStructなどの複雑なデータ型をサポートしていません。その他の互換性のない型
Hologres の
MONEYなどのデータ型は、MaxCompute に対応するデータ型がないためサポートされていません。
次の表に、Hologres と 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 の これは MaxCompute の | |||
TIMESTAMP WITH TIME ZONE (エイリアス:TIMESTAMPTZ) | TIMESTAMP | タイムスタンプデータ型はナノ秒まで正確で、 基になる精度の変換は自動的に処理されます。 | |||
DECIMAL (エイリアス:NUMERIC) | DECIMAL(precision,scale) | 10 進数の正確な数値型。
MaxCompute では、精度が指定されていない場合、 | |||
CHAR(n) | CHAR(n) | MaxCompute では、 Hologres の | |||
VARCHAR(n) | VARCHAR(n) | MaxCompute の Hologres では、 | |||
DATE | DATE | データ型は | |||
INT4[] | ARRAY<INT> | Hologres の配列は、対応する MaxCompute の | |||
INT8[] | ARRAY<BIGINT> | ||||
FLOAT4[] | ARRAY<FLOAT> | ||||
FLOAT8[] | ARRAY<DOUBLE> | ||||
BOOLEAN[] | ARRAY<BOOLEAN> | ||||
TEXT[] | ARRAY<STRING> | ||||
JSONB | JSON | Hologres の | |||
JSON | STRING | JDBC を使用する場合、Hologres の | |||
SERIAL (自動インクリメント) | INT | MaxCompute は Hologres の | |||
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 データを直接読み取る際の 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 からデータを読み取る際、デフォルトのデータ分割戦略により、マッパーインスタンスの数が 7,777 の同時実行数制限を超える可能性があります。
説明この制限は、過剰な数のマッパーを持つジョブの実行を防ぎ、Hologres ファイルとネットワーク接続の安定性を保護します。
ソリューション
このエラーは、次のパラメーターを設定することで解決できます。
SET odps.external.holo.mapper.instances=10000; -- 同時実行数制限を増やします。最大値は 10,000 です。 SET odps.sql.mapper.split.size=512; -- ジョブの同時実行数を調整します。最大値は 512 MB です。
Hologres 外部テーブルでの SQL ジョブの低速化
問題
SDK を使用して MaxCompute 外部テーブルのデータを検索すると、パフォーマンスが低下します。
ソリューション
外部テーブルはフルテーブルスキャンのみをサポートするため、パフォーマンスが低下します。パフォーマンスを向上させるには、代わりに MaxCompute 内部テーブルを使用してください。
列名がキーワードである場合のエラー
問題
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"'パラメーターを追加します。
ダブル署名モードでの password authentication failed for user "mcslr$STS.******" エラー
問題
RAM ユーザーまたは RAM ロールがサービスリンクロール権限付与モード (ダブル署名モード) を使用して Hologres 外部テーブルを読み取ると、ジョブが
password authentication failed for user "mcslr$STS.******"エラーで失敗する可能性があります。以下にエラーメッセージの例を示します:ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: splitByCommonTable() failed, dataSourceId=[TableScan1], tableId=[*****.*****], location=[jdbc:postgresql://hgpostcn-cn-*****-cn-beijing-internal.hologres.aliyuncs.com:80/*****?ApplicationName=MaxCompute¤tSchema=public&useSSL=false&table=*****/], rootCause -> common/table/jni/utils/jni_helper.cpp(126): UnretryableException: Common table io jni exception - ExceptionType: com.aliyun.odps.hive.wrapper.thrift.RequestException Message: null StackTrace: RequestException(reason:java.lang.RuntimeException: java.lang.RuntimeException: java.lang.RuntimeException: org.postgresql.util.PSQLException: FATAL: password authentication failed for user "mcslr$STS.*********"ソリューション
このエラーは、ユーザーが Hologres のテーブルに対する必要な読み取り権限を持っていないことを示します。これを解決するには、Alibaba Cloud アカウントまたは管理者アカウントで Hologres コンソールにログインします。コンソールで Security Center に移動し、ユーザー管理にユーザーを追加し、必要なデータベース権限を付与します。
直接読み取りモードでの Holo-side PPD disabled --> The Holo snapshot PPD mode is enabled, but FAILED to push down the filter into Holo エラー
エラーメッセージ
Holo-side PPD disabled --> The Holo snapshot PPD mode is enabled, but FAILED to push down the filter into Holo, errorMsg[storage/table/src/holo/snapshot.cpp(319): StorageException: Create/Get snapshot failed for table: test_multi_type_ppd partition: Query:select holo_create_table_snapshot('public.test_multi_type_ppd', 259200, filter=>$$c_id = 3$$) with error ERROR: internal error: Failed to build fragment dag desc: node type 65 is not supportedソリューション
ご利用の Hologres 内部テーブルが「使用上の注意」の要件を満たしていることを確認してください。
参考
Hologres 外部テーブルに関する一般的な問題の詳細については、「レイクハウスと外部テーブルに関するよくある質問」をご参照ください。