建立純量 Python UDF - Amazon Redshift

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

建立純量 Python UDF

純量 Python UDF 包含呼叫函數時執行的 Python 程式,並傳回單一值。CREATE FUNCTION 命令定義下列參數:

  • (選用) 輸入引數。每個引數必須具有一個名稱和一個資料類型。

  • 一個傳回資料類型。

  • 一個可執行的 Python 程式。

這時的輸入及傳回的資料類型可為 SMALLINT、INTEGER、BIGINT、DECIMAL、REAL、DOUBLE PRECISION、BOOLEAN、CHAR、VARCHAR、DATE 或 TIMESTAMP。此外,Python UDF 還可以使用資料類型 ANYELEMENT,而 Amazon Redshift 會根據執行期提供的引數,自動將其轉換為標準資料類型。如需更多資訊,請參閱 ANYELEMENT 資料類型

當 Amazon Redshift 查詢呼叫純量 UDF 時,下列步驟會在執行期發生。

  1. 函數會將輸入引數轉換為 Python 資料類型。

    如需將 Amazon Redshift 資料類型映射至 Python 資料類型,請參閱 Python UDF 資料類型

  2. 函數會執行 Python 程式,剖析已轉換的輸入引數。

  3. Python 程式碼會傳回單一值。傳回值的資料類型必須對應至函數定義所指定的 RETURNS 資料類型。

  4. 函數會將 Python 傳回值轉換為指定的 Amazon Redshift 資料類型,然後將該值傳回至佇列。

注意

Python 3 不可用於 Python UDF。要獲得對 Amazon Redshift UDF 的 Python 3 支持,請改用建立純量 Lambda UDF

純量 Python UDF 範例

下列範例會建立一個函數,比較兩個數字並傳回較大的值。請注意,雙貨幣符號 ($$) 之間程式碼的縮排是 Python 需求。如需詳細資訊,請參閱 CREATE FUNCTION

create function f_py_greater (a float, b float) returns float stable as $$ if a > b: return a return b $$ language plpythonu;

下列查詢會呼叫新的 f_greater 函數來查詢 SALES 資料表,並傳回 COMMISSION 或 20% 的 PRICEPAID,以較大者為準。

select f_py_greater (commission, pricepaid*0.20) from sales;

ANYELEMENT 資料類型

ANYELEMENT 是多型資料類型。這表示,若對引數的資料類型使用 ANYELEMENT 來宣告函數,則函數可以接受任何標準 Amazon Redshift 資料類型,做為呼叫函數時該引數的輸入。ANYELEMENT 引數會設為呼叫函數時實際傳遞至其中的資料類型。

如果函數使用多個 ANYELEMENT 資料類型,則在呼叫函數時,它們必須全都解析為相同的實際資料類型。所有 ANYELEMENT 引數資料類型都會設為傳遞至 ANYELEMENT 之第一個引數的實際資料類型。例如,宣告為 f_equal(anyelement, anyelement) 的函數將採用任何兩個輸入值,只要它們是相同的資料類型。

如果函數的輸入值宣告為 ANYELEMENT,則至少一個輸入引數必須是 ANYELEMENT。傳回值的實際資料類型將與提供給 ANYELEMENT 輸入引數的實際資料類型相同。