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

Hologres:ユーザー定義関数 (リモート UDF)

最終更新日:Feb 05, 2026

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 サービスリンクロールを付与済みである必要があります。

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

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

      yuyuyuuyueeeee

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

  • Alibaba Cloud Function Compute サービスを有効化した後、Hologres から呼び出す関数を開発およびデプロイする必要があります。詳細については、「コード開発」をご参照ください。

注意事項

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

  • 以下のデータ型とそれに対応する配列型のみがサポートされています:BOOLEANINTEGERBIGINTREALDOUBLE 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

はい

関数の名前。

  • 関数名は、同一スキーマ内で一意である必要があり、同じパラメーター型を持つ既存の関数と重複してはなりません。ただし、異なるパラメーター型を持つ場合は、同名の関数をオーバーロードできます(例: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

はい

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

いいえ

呼び出す関数バージョンまたはエイリアスを指定します。デフォルト値は 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 'スカラー 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 関数を使用します。

  1. 関数計算をアクティブにします。

    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('イベントに "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 と入力します。

  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)