すべてのプロダクト
Search
ドキュメントセンター

Hologres:リモート UDF

最終更新日:Jun 26, 2026

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 サービスリンクロールは承認されています。

    1. Hologres コンソールにログインします。左側のナビゲーションウィンドウで、サービスにリンクされたロールに権限を付与する をクリックします。

    2. AliyunServiceRoleForHologresRemoteUDF を選択し、ワンクリック権限付与 をクリックします。

説明
  • Hologres インスタンスと Function Compute サービスは、同じリージョンにある必要があります。

  • Alibaba Cloud Function Compute を有効化し、Hologres から呼び出す関数を開発・デプロイします。詳細については、「コード開発の概要」をご参照ください。

制限事項

  • スカラー UDF とユーザー定義テーブル関数 (UDTF) のみがサポートされています。ユーザー定義集計関数 (UDAF) はサポートされていません。

  • サポートされているデータ型は、BOOLEANINTEGERBIGINTREALDOUBLE PRECISIONTEXT およびそれらに対応する配列型のみです。

  • リモート関数は定数の入力パラメーターをサポートしていません。

  • この機能は 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

はい

関数名。

  • 関数名は同じスキーマ内で一意である必要があり、同じパラメーター型を持つ既存の関数と競合することはできません。ただし、異なるパラメーター型での関数のオーバーロードはサポートされています。たとえば、rf_sum(int)rf_sum(float) を作成できます。

  • 競合を避けるため、リモート関数の名前には rf_ プレフィックスを追加することを推奨します。

  • schema1.func のようにスキーマを指定すると、関数はそのスキーマ内に作成されます。

  • CREATE OR REPLACE FUNCTION を使用して関数を置き換える場合、関数名、パラメーター型、または戻り値の型を変更することはできません。代わりに、関数を削除して再作成する必要があります。

関数パラメーター

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

いいえ

呼び出す関数のバージョンまたはエイリアスを指定します。デフォルト値は LATEST です。

リクエスト圧縮アルゴリズム

compression

いいえ

関数呼び出しリクエストとレスポンスの圧縮アルゴリズムを指定します。有効な値:

  • None:圧縮は無効です。これがデフォルトです。

  • GZIP:GZIP 圧縮が有効です。

リクエストごとの最大バッチサイズ

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 のブール値にシリアル化されます。

  • INTEGERBIGINT は JSON の数値にシリアル化されます。

  • REALDOUBLE 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 関数を使用します。

  1. Function Compute を有効化します。

    Function Compute コンソールにログインします。画面のプロンプトに従って、無料のリソースパッケージを申請することもできます。詳細については、「無料利用枠」をご参照ください。

  2. FC イベント関数を作成します。

    1. 左側のナビゲーションウィンドウで、[関数] をクリックします。ご利用の Hologres インスタンスが存在するリージョンに切り替えます。

    2. [関数] ページで、[関数の作成] をクリックします。[関数の作成] ページが開きます。

    3. [イベント関数] を選択し、次のパラメーターを設定します。その他のパラメーターはデフォルト設定のままにします。詳細については、「イベントトリガー関数の作成」をご参照ください。

      パラメーター

      説明

      関数名

      カスタム名。例: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 と入力します。

  3. 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';
  4. テストデータを準備します。

    CREATE TABLE test_array (
        numbers INTEGER[]
    );
    INSERT INTO test_array (numbers) VALUES
      (ARRAY[1, 3]),
      (ARRAY[2, 4]),
      ('{}'),  
      (ARRAY[]::INTEGER[]),  
      (NULL);
  5. リモート関数を呼び出します。

    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)