V3.1 以降、Hologres は Function Compute (FC) のユーザー定義関数へのリモート呼び出しをサポートし、複雑なビジネスロジックの処理や高度なデータ操作を実行できるようになりました。このトピックでは、Hologres でリモート UDF を使用する方法について説明します。
概要
リモート関数は、Alibaba Cloud Function Compute (FC) などのサービスから外部関数を統合することで、Hologres のデータ処理および分析機能を拡張します。この統合により、Hologres のデータをクエリする際に FC 関数を動的に呼び出し、複雑なビジネスロジックの処理や高度なデータ操作を実行できます。
リモート関数は、以下のユースケースをサポートしています。
-
リアルタイムデータ処理:データクエリ中に外部関数を呼び出して、データクレンジング、フォーマット変換、または複雑な計算を実行します。
-
サードパーティサービスとの統合:Function Compute を使用して、Hologres のデータを利用し、他の Alibaba Cloud サービスやサードパーティ API と連携します。
-
高度な分析:Function Compute を使用して、モデル推論や機械学習などの高度な分析アルゴリズムを実行し、結果を直接 Hologres に書き戻します。
前提条件
-
V3.1 以降の Hologres インスタンスが必要です。詳細については、「Hologres インスタンスの購入」をご参照ください。
-
Function Compute を有効化し、V3.0 インスタンスを使用しています。サービスを有効化するには、Function Compute コンソールにログインします。
-
AliyunServiceRoleForHologresRemoteUDFサービスリンクロールは承認されています。-
Hologres コンソールにログインします。左側のナビゲーションウィンドウで、サービスにリンクされたロールに権限を付与する をクリックします。
-
AliyunServiceRoleForHologresRemoteUDFを選択し、ワンクリック権限付与 をクリックします。
-
-
Hologres インスタンスと Function Compute サービスは、同じリージョンにある必要があります。
-
Alibaba Cloud Function Compute を有効化し、Hologres から呼び出す関数を開発・デプロイします。詳細については、「コード開発の概要」をご参照ください。
制限事項
-
スカラー UDF とユーザー定義テーブル関数 (UDTF) のみがサポートされています。ユーザー定義集計関数 (UDAF) はサポートされていません。
-
サポートされているデータ型は、
BOOLEAN、INTEGER、BIGINT、REAL、DOUBLE PRECISION、TEXTおよびそれらに対応する配列型のみです。 -
リモート関数は定数の入力パラメーターをサポートしていません。
-
この機能は Function Compute (FC) で費用が発生します。詳細については、「課金」をご参照ください。
-
この機能は Hologres で追加費用は発生しません。
-
リモート UDF は Hologres クエリエンジン (HQE) でのみ実行できます。暗号化および復号 (PGCRYPTO) 拡張関数など、PostgreSQL 互換クエリエンジン (PQE) でのみ実行されるビルトイン関数と同じ SQL ステートメントでは使用できません。これらを一緒に使用すると、エンジンの実行競合が発生し、以下のエラーが返されます。
ERROR: ORCA failed to produce a plan : No plan has been computed for required propertiesリモート UDF と PQE 専用のビルトイン関数を同時に使用するには、操作を別々の SQL ステートメントに分割して個別に実行してください。
リモート UDF の管理
拡張機能の作成
リモート関数を使用するには、まず次のコマンドを実行して拡張機能を作成する必要があります。
CREATE EXTENSION [ IF NOT EXISTS ] function_compute;
関数の作成
構文
CREATE [ OR REPLACE ] FUNCTION <function_name>
( [ [ argmode ] [ argname ] <argtype> [ { DEFAULT | = } default_expr ] [, ...] ] )
[ RETURNS [SETOF] rettype | RETURNS TABLE ( column_name column_type) ]
LANGUAGE function_compute
AS '<fc_endpoint>/<func_name>'
{
{ CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }
| SET function_compute.qualifier TO <qualifier>
| SET function_compute.compression TO <compression>
| SET function_compute.max_batch_size TO <max_batch_size>
} ...
パラメーター
|
カテゴリ |
パラメーター |
必須 |
説明 |
|
関数名 |
function_name |
はい |
関数名。
|
|
関数パラメーター |
argtype |
はい |
パラメーターのデータ型。 |
|
argmode |
いいえ |
有効な値は IN、OUT、INOUT です。デフォルトは IN です。曖昧さを避けるため、INOUT の使用は推奨しません。関数は OUT または INOUT パラメーターを 1 つしか持てません。 |
|
|
argname |
いいえ |
パラメーター名。
|
|
|
default_expr |
いいえ |
デフォルト値。これは入力パラメーターにのみ適用されます。パラメーターにデフォルト値がある場合、後続のすべてのパラメーターにもデフォルト値が必要です。 |
|
|
FC エンドポイント |
LANGUAGE function_compute |
はい |
関数が Function Compute サービスを使用することを指定します。 |
|
fc_endpoint |
はい |
Function Compute の内部エンドポイント。詳細については、「エンドポイント」をご参照ください。 |
|
|
func_name |
はい |
ターゲット関数の名前。事前に Function Compute コンソールで作成しておく必要があります。 |
|
|
戻り値の型 |
rettype |
いいえ |
戻り値のデータ型。 OUT または INOUT パラメーターを使用する場合、RETURNS 句を省略できます。指定する場合、この句は出力パラメーターによって暗示される結果の型と一致する必要があります。 |
|
column_name |
いいえ |
RETURNS TABLE 構文では、これは出力列の名前です。 これは、名前付き OUT パラメーターを宣言する別の方法です。違いは、RETURNS TABLE は RETURNS SETOF も意味し、関数がセットを返すことを意味します。 |
|
|
column_type |
いいえ |
RETURNS TABLE 構文では、これは出力列のデータ型です。 |
|
|
NULL 処理ポリシー |
CALLED ON NULL INPUT |
いいえ |
デフォルトの動作。関数は NULL 入力に対しても呼び出され、NULL ロジックを自身で処理する必要があります。 |
|
RETURNS NULL ON NULL INPUT |
いいえ |
いずれかの入力が NULL の場合、すぐに NULL を返します。 |
|
|
STRICT |
いいえ |
RETURNS NULL ON NULL INPUT のエイリアスです。 |
|
|
関数バージョン管理 |
qualifier |
いいえ |
呼び出す関数のバージョンまたはエイリアスを指定します。デフォルト値は |
|
リクエスト圧縮アルゴリズム |
compression |
いいえ |
関数呼び出しリクエストとレスポンスの圧縮アルゴリズムを指定します。有効な値:
|
|
リクエストごとの最大バッチサイズ |
max_batch_size |
いいえ |
各バッチで FC に送信する最大行数を指定します。 この設定を使用して、メモリ制限やその他の制約がある FC 関数のバッチサイズを制限します。このパラメーターを指定しない場合、Hologres は最適なバッチサイズを自動的に計算して使用します。ほとんどの場合、このパラメーターを設定する必要はありません。 |
例
-
スカラー UDF の作成
CREATE OR REPLACE FUNCTION rf_add ( a INTEGER, b INTEGER DEFAULT 1 ) RETURNS BIGINT LANGUAGE function_compute AS 'xxxxxxxxxxxxx.cn-shanghai-internal.fc.aliyuncs.com/add' ; -
UDTF の作成
-- メソッド 1 CREATE OR REPLACE FUNCTION rf_unnest(TEXT []) RETURNS TABLE (item TEXT ) LANGUAGE function_compute AS 'xxxxxxxxxxxxxx.cn-hangzhou-internal.fc.aliyuncs.com/unnest' STRICT SET function_compute.max_batch_size TO 1024; -- メソッド 2 CREATE OR REPLACE FUNCTION rf_unnest(TEXT []) RETURNS SETOF TEXT LANGUAGE function_compute AS 'xxxxxxxxxxxxxx.cn-hangzhou-internal.fc.aliyuncs.com/unnest' STRICT SET function_compute.max_batch_size TO 1024;
関数の表示
作成されたリモート関数を表示します。
SELECT
CASE
WHEN p.proretset = 'f' THEN 'scalar UDF'
WHEN p.proretset = 't' THEN 'UDTF'
END AS function_type,
n.nspname AS schema_name,
p.proname AS function_name,
pg_get_function_arguments(p.oid) AS arguments,
pg_get_function_result(p.oid) AS return_type,
p.proisstrict AS is_strict,
p.proconfig AS config,
pg_get_functiondef(p.oid) AS definition
FROM
pg_proc p
JOIN pg_language l ON p.prolang = l.oid
JOIN pg_namespace n ON p.pronamespace = n.oid
WHERE
l.lanname = 'function_compute'
AND p.prokind != 'p'
ORDER BY
function_type,
schema_name,
function_name;
関数の削除
構文
DROP FUNCTION [ IF EXISTS ] <function_name> [ ( [ [ argmode ] [ argname ] <argtype> [, ...] ] ) ] [, ...]
パラメーター
|
パラメーター |
必須 |
説明 |
|
function_name |
はい |
削除する関数の名前。 |
|
argtype |
はい |
パラメーターのデータ型。 |
|
argmode |
いいえ |
有効な値は IN、OUT、INOUT です。デフォルトは IN です。曖昧さを避けるため、INOUT の使用は推奨しません。関数は OUT または INOUT パラメーターを 1 つしか持てません。 |
|
argname |
いいえ |
パラメーター名。入力パラメーターの場合、名前はドキュメント目的のみです。出力パラメーターの場合、名前は結果セットの列名を決定します。省略した場合、システムはデフォルト名を生成します。 |
例
DROP FUNCTION rf_add(INTEGER, INTEGER);
データ交換フォーマット
リクエストフォーマット:Hologres から FC へ
Hologres は、POST リクエストを送信することで Function Compute の InvokeFunction API を呼び出します。リクエストボディは JSON オブジェクトです。このオブジェクトには data という単一のキーが含まれています。その値は 2 次元の配列で、各内部配列はバッチ内の 1 行のデータを表し、関数呼び出しのパラメーターを含みます。
データシリアル化ルール
-
BOOLEANは JSON のブール値にシリアル化されます。 -
INTEGERとBIGINTは JSON の数値にシリアル化されます。 -
REALとDOUBLE PRECISIONは JSON の数値にシリアル化されます。 -
TEXTは JSON の文字列にシリアル化されます。 -
SQL の
NULL値は JSON のnullにシリアル化されます。
例
次のコードは、シグネチャが rf_demo(TEXT, INTEGER, BOOLEAN) のリモート関数のシリアル化されたリクエストのサンプルを示しています。
{
"data": [
["foo", 100, true],
[null, null, false],
["bar", 200, false]
]
}
レスポンスフォーマット:FC から Hologres へ
Function Compute がデータのバッチを処理した後、結果を次のように JSON 形式で Hologres に返す必要があります。
-
スカラー UDF
-
トップレベルのオブジェクトには
resultsフィールドが含まれている必要があります。その値は配列でなければならず、各要素は入力データの 1 行に対する結果に対応します。 -
各行の結果は配列でなければならず、結果の順序は入力行の順序と一致する必要があります。たとえば、results 配列の N 番目の要素は、N 番目の入力行に対応します。
次のコードは、4 行のバッチに対するレスポンスのサンプルを示しています。
{ "results": [ ["Beijing"], ["Shanghai"], ["Shenzhen"], ["Guangzhou"] ] } -
-
ユーザー定義テーブル関数 (UDTF) は、単一行の入力から複数行の出力を生成することをサポートしています。元の入力行との関係を識別するために、行番号 (row_num) が必要です。
-
トップレベルのオブジェクトには
resultsフィールドが含まれている必要があります。その値は配列でなければならず、各要素は出力データの 1 行に対応します。 -
各行の結果は、2 つの要素を含む配列でなければなりません。
-
row_num(最初の要素):元の入力行の 0 から始まるインデックスで、入力と出力を関連付けるために使用されます。row_num の値は昇順で返される必要があります。 -
result (2 番目の要素):単一の出力行の値。
-
例:
{ "results": [ [0, "Beijing"], [1, "Shanghai"], [3, "Shenzhen"], [3, "Guangzhou"], ] } -
例
この例では、unnest 関数を使用します。
-
Function Compute を有効化します。
Function Compute コンソールにログインします。画面のプロンプトに従って、無料のリソースパッケージを申請することもできます。詳細については、「無料利用枠」をご参照ください。
-
FC イベント関数を作成します。
-
左側のナビゲーションウィンドウで、[関数] をクリックします。ご利用の Hologres インスタンスが存在するリージョンに切り替えます。
-
[関数] ページで、[関数の作成] をクリックします。[関数の作成] ページが開きます。
-
[イベント関数] を選択し、次のパラメーターを設定します。その他のパラメーターはデフォルト設定のままにします。詳細については、「イベントトリガー関数の作成」をご参照ください。
パラメーター
説明
関数名
カスタム名。例:
unnest。ランタイム
[ビルトインランタイム] / [Python] / [Python 3.10] を選択します。
コードアップロード方法
[ZIP のアップロード] を選択します。
コードパッケージ
コードパッケージをアップロードします。
次のコードを unnest.py として保存し、unnest.zip という名前のファイルに圧縮します。
import json def unnest(event, context): evt = json.loads(event) data = evt.get('data', None) if data is None: raise ValueError('no "data" key in event.') if not isinstance(data, list): raise ValueError('data is not a list.') res = list() for i in range(len(data)): if len(data[i]) != 1 or not isinstance(data[i], list): raise ValueError('the item in data is not a list.') for item in data[i][0]: res.append([i, item]) return json.dumps({'results': res})ハンドラー
unnest.unnestと入力します。
-
-
Hologres リモート関数を作成します。
説明次の手順は HoloWeb で実行します。詳細については、「HoloWeb への接続」をご参照ください。
CREATE EXTENSION IF NOT EXISTS function_compute; CREATE OR REPLACE FUNCTION rf_unnest(INTEGER []) RETURNS SETOF INTEGER STRICT LANGUAGE function_compute AS 'xxxxxxxxxxxxxxxxx.cn-shanghai-internal.fc.aliyuncs.com/unnest'; -
テストデータを準備します。
CREATE TABLE test_array ( numbers INTEGER[] ); INSERT INTO test_array (numbers) VALUES (ARRAY[1, 3]), (ARRAY[2, 4]), ('{}'), (ARRAY[]::INTEGER[]), (NULL); -
リモート関数を呼び出します。
SELECT numbers, rf_unnest(numbers) FROM test_array; numbers | rf_unnest ---------+----------- {2,4} | 2 {2,4} | 4 {1,3} | 1 {1,3} | 3 (4 rows)