Hologres v3.1 以降では、Function Compute (FC) 内のユーザー定義関数 (UDF) へのリモート呼び出しをサポートします。これらの関数を活用して、複雑なビジネスロジックの処理や高度なデータ操作を実行できます。本トピックでは、Hologres における UDF の使用方法について説明します。
機能の概要
リモート関数は、外部関数を Hologres に統合することで、データ処理および分析機能を拡張する仕組みです。Hologres v3.1 では、Alibaba Cloud Function Compute (FC) サービスへの呼び出しをサポートしています。この機能により、Hologres データをクエリする際に、動的に FC を呼び出して複雑なビジネスロジックを処理したり、高度なデータ操作を実行したりできます。
リモート関数は、以下の 3 つのシナリオに対応しています:
-
リアルタイムデータ処理:データクエリ中にリアルタイムで外部関数を呼び出し、データクリーニング、フォーマット変換、複雑な計算などを実行します。
-
サードパーティサービスとの連携:Hologres データを用いて、Function Compute 経由で他の Alibaba Cloud サービスやサードパーティ API と連携します。
-
高度な分析:Function Compute を用いて、モデル推論や機械学習などの高度な分析アルゴリズムを実装し、その結果を直接 Hologres に書き込みます。
前提条件
-
Hologres インスタンスのバージョンが v3.1 以降である必要があります。詳細については、「Hologres インスタンスの購入」をご参照ください。
-
Function Compute を有効化済みであり、FC インスタンスのバージョンが v3.0 である必要があります。これを行うには、Function Compute コンソール にログインします。
-
AliyunServiceRoleForHologresRemoteUDFサービスリンクロールを付与済みである必要があります。-
Hologres コンソール にログインします。左側のナビゲーションウィンドウで、サービスにリンクされたロールに権限を付与する をクリックします。
-
AliyunServiceRoleForHologresRemoteUDFを選択し、ワンクリック権限付与 をクリックします。以下に例を示します。
-
Hologres インスタンスと関数計算サービスは同じリージョンにある必要があります。
-
Alibaba Cloud Function Compute サービスを有効化した後、Hologres から呼び出す関数を開発およびデプロイする必要があります。詳細については、「コード開発」をご参照ください。
注意事項
-
スカラー型のユーザー定義関数 (UDF) およびユーザー定義のテーブル値関数 (UDTF) のみがサポートされています。ユーザー定義の集計関数 (UDAF) はサポートされていません。
以下のデータ型とそれに対応する配列型のみがサポートされています:
BOOLEAN、INTEGER、BIGINT、REAL、DOUBLE PRECISION、およびTEXT。-
リモート関数は、定数を入力パラメーターとして受け付けません。
-
本機能の利用には、Function Compute (FC) での課金が発生します。詳細については、「課金」をご参照ください。
-
本機能の利用に伴い、Hologres で追加の料金は発生しません。
ユーザー定義関数の管理
拡張機能の作成
本機能を初めて使用する前に、拡張機能を作成する必要があります。コマンドは以下のとおりです:
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 |
はい |
FC の内部ネットワークエンドポイントです。詳細については、「サービスエンドポイント」をご参照ください。 |
|
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 'スカラー 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 リクエストで FC の InvokeFunction API を呼び出します。リクエストボディは JSON オブジェクトであり、data キーを含み、その値は 2 次元配列です。配列の各要素は、バッチ内の 1 行のデータを表し、関数呼び出しのパラメーターを含みます。
データシリアル化ルール
-
BOOLEANは JSON の boolean 型にシリアル化されます。 -
INTEGERおよびBIGINTは JSON の number 型にシリアル化されます。 -
REALおよびDOUBLE PRECISIONは JSON の number 型にシリアル化されます。 -
TEXTは JSON の string 型にシリアル化されます。 -
NULLは JSON のnullにシリアル化されます。
例
以下のコードは、シグネチャが rf_demo(TEXT, INTEGER, BOOLEAN) のリモート関数に対するシリアル化されたリクエストの例です。
{
"data": [
["foo", 100, true],
[null, null, false],
["bar", 200, false]
]
}
FC から Hologres への応答フォーマット
FC がバッチデータの処理を完了した後、以下の仕様に準拠した JSON 形式で結果を Hologres に返す必要があります:
-
スカラー型 UDF
-
最上位のオブジェクトには
resultsフィールドを含める必要があります。このフィールドの値は配列であり、各要素は入力データの 1 行に対する結果に対応します。 -
各結果は配列である必要があります。結果は入力データと同じ順序で返す必要があります。results 配列の N 番目の要素は、入力データの N 番目の行に対応します。
以下のコードは、4 行のバッチに対する戻り値の例です:
{ "results": [ ["Beijing"], ["Shanghai"], ["Shenzhen"], ["Guangzhou"] ] } -
-
UDTF:UDTF は、1 行の入力データから複数行の出力データを生成できます。出力を元の入力行に関連付けるために、行番号 (row_num) を使用します。
-
最上位のオブジェクトには
resultsフィールドを含める必要があります。このフィールドの値は配列であり、各要素は 1 行の出力データに対応します。 -
results 配列の各要素は、2 つの要素を含む配列である必要があります:
-
row_num(最初の要素):元の入力行の 0 基準のインデックスです。これは出力を入力に関連付けるために使用されます。row_num の値は昇順で返す必要があります。
-
result(2 番目の要素):処理済みの戻り値の 1 行です。
-
以下に例を示します:
{ "results": [ [0, "Beijing"], [1, "Shanghai"], [3, "Shenzhen"], [3, "Guangzhou"], ] } -
ユーザー定義関数の使用例
この例では、unnest 関数を使用します。
-
関数計算をアクティブにします。
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('イベントに "data" キーがありません。') # 日本語訳 if not isinstance(data, list): raise ValueError('data はリストではありません。') # 日本語訳 res = list() for i in range(len(data)): if len(data[i]) != 1 or not isinstance(data[i], list): raise ValueError('data 内のアイテムはリストではありません。') # 日本語訳 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)