創建一個標量 Python UDF - Amazon Redshift

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

創建一個標量 Python UDF

標量 Python UDF 包含一個 Python 程序,該程序在調用函數時運行並返回單個值。CREATE FUNCTION 命令定義下列參數:

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

  • 一個傳回資料類型。

  • 一個可執行的 Python 程式。

輸入和傳回資料類型可以是SMALLINTINTEGERBIGINT、DECIMAL、REAL、DOUBLEPRECISION、BOOLEAN、CHAR、VARCHAR、、DATE、或TIMESTAMP。此外,Python 還UDFs可以使用資料類型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 UDFs。要獲得對 Amazon Redshift 的 Python 3 支持UDFs,請創建一個標量 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;

下列查詢會呼叫 new 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輸入引數提供的實際資料類型相同。