本文為您介紹Python自訂表格值函數(UDTF)的開發、註冊和使用流程。
定義
自訂表格值函數(UDTF),將0個、1個或多個標量值作為輸入參數(可以是變長參數)。資料表值函式可以返回任意數量的行作為輸出,而不僅是1個值。返回的行可以由1個或多個列組成。調用一次函數輸出多行或多列資料。與自訂的純量涵式類似,但與純量涵式不同。
使用限制
由於Realtime ComputeFlink版受部署環境和網路環境等因素的影響,開發Python自訂函數時,需要注意以下限制:
僅支援開源Flink V1.12及以上版本。
Flink工作空間已預裝了Python,因此需要您在對應Python版本上開發代碼。
說明
Realtime Compute引擎VVR 8.0.11以下版本預裝Python 3.7.9版本,Realtime Compute引擎VVR 8.0.11及以上版本預裝Python 3.9.21版本。如需將低版本升級至Realtime Compute引擎VVR 8.0.11及以上版本,必須對先前版本的PyFlink作業進行重新測試、部署和運行。
Flink運行環境僅支援JDK 8和JDK 11,如果Python作業中依賴第三方JAR包,請確保JAR包相容。
僅支援開源Scala V2.11版本,如果Python作業中依賴第三方JAR包,請確保使用Scala V2.11對應的JAR包依賴。
UDTF開發
說明
Flink為您提供了Python UDX樣本,便於您快速開發UDX。Flink Python UDX樣本中包含了Python UDF、Python UDAF和Python UDTF的實現。本文以Windows作業系統為例,為您介紹如何進行UDTF開發。
重要
自訂函數的註冊名僅允許小寫字母、數字和橫杠(-),不支援底線(\_)和其他特殊字元。
函數名不能與系統內建函數重名。阿里雲Flink託管環境已預置部分內建函數(如split),如果自訂函數與內建函數同名,會導致註冊失敗或SQL校正報錯。建議使用自訂首碼命名(如my-split)。
下載並解壓python\_demo-master樣本到本地。
在PyCharm中,單擊file > open,開啟剛才解壓縮完成的python\_demo-master。
雙擊開啟\\python\_demo-master\\udx\\udtfs.py後,根據您的業務,修改udtfs.py檔案內容。
該樣本中,my\_split定義了將一行字串按照豎線(|)分割成多列字串的代碼。
from pyflink.table import DataTypes
from pyflink.table.udf import udtf
@udtf(result_types=[DataTypes.STRING(), DataTypes.STRING()])
def my_split(s: str):
splits = s.split("|")
yield splits[0], splits[1]
在下載檔案中udx所在的目錄(即\\python\_demo目錄)下執行如下命令打包檔案。
zip -r python_demo.zip udx
\\python\_demo\\目錄下會出現python\_demo.zip的ZIP包,即代表完成了UDTF開發工作。
UDTF註冊
UDTF註冊過程,請參見管理自訂函數(UDF)。
UDTF使用
在完成UDTF註冊後,您就可以使用UDTF,詳細的操作步驟如下。
Flink SQL作業開發。詳情請參見SQL作業開發。
ASI\_UDTF\_Source表中每行字串的message欄位與字串aa按照豎線(|)串連之後,按照豎線(|)分割成多列,程式碼範例如下。
CREATE TEMPORARY TABLE ASI_UDTF_Source (
`message` VARCHAR
) WITH (
'connector'='datagen'
);
CREATE TEMPORARY TABLE ASI_UDTF_Sink (
name VARCHAR,
place VARCHAR
) WITH (
'connector' = 'blackhole'
);
INSERT INTO ASI_UDTF_Sink
SELECT name,place
FROM ASI_UDTF_Source,lateral table(my_split(concat_ws('|', `message`, 'aa'))) as T(name,place);
在營運中心 > 作業營運頁面,單擊目標作業名稱操作列的啟動。
啟動成功後,ASI\_UDTF\_Sink表會被插入兩列資料,這兩列資料是ASI\_UDTF\_Source表中message和aa欄位按照豎線(|)串連後,再按照豎線(|)分割成多列的字串。