一、前言
MaxCompute中的python是2.7環境的,可以通過sys.version驗證,話說Python社區都准備放棄2.7了,阿里雲啥時候跟上時代的步伐升級到3.x哦。
我們測試一下:
Executing user script with PyODPS 0.8.0 2.7.10 (default, Sep 18 2015, 16:43:46) [GCC 4.1.2 20080704 (Red Hat 4.1.2-51)] |
可以看到數據開發中的PyODPS版本號,以及Python的版本為2.7.10,機器的系統是Red Hat,一個Linux環境。
據官方文檔稱,Python代碼以沙箱模式執行,在一個受限的環境中運行,部分模塊是不可用的。所有純Python實現(不依賴擴展模塊)的模塊都是可用的,以及部分C實現的模塊,所以不要想當然把本地的一些代碼直接挪上來,可能某些包是沒有的哦。
二、UDF實戰
2.1 指定參數和返回值類型
Python UDF目前支持的MaxCompute SQL數據類型包括Bigint、String、Double、Boolean和Datetime。SQL語句在執行之前,必須確定所有函數的參數類型和返回值類型。
參數與返回值的指定方式如下:
@odps.udf.annotate(signature)
很顯然,是一個裝飾器的寫法。
合法的signature如下:
'bigint,double->string' # 參數為bigint、double,返回值為string 'bigint,boolean->string,datetime' # UDTF參數為bigint、boolean,返回值為string,datetime '*->string' # 變長參數,輸入參數任意,返回值為string '->double' # 參數為空,返回值為double |
2.2 編寫UDF函數
實現一個UDF非常簡單,只需要定義一個 new-style class,並實現 evaluate方法。
我以一個使用正則表達式匹配方括號內的內容為例,寫一個自定義函數:
# -*- coding: utf-8 -*-
|
解析1:第一行就是Python2.x版本的歷史遺留問題,2.x版本原生對非ASCII字符編碼支持很差,需要手動設定編碼格式;
解析2:關鍵就是聲明一個類,然后實現evaluate方法,返回結果值即可。
2.3 上傳資源
寫好的Python代碼需要上傳為odps資源,在數據開發 > 業務流程 > 資源下,新建資源,選擇Python,然后在編輯框里貼入上述代碼,提交即可。
2.4 注冊函數
成功上傳了資源后,在數據開發 > 業務流程 > 函數中右鍵新建自定義函數。
寫一個函數名,資源列表填上剛剛上傳的資源文件,類名以 資源名.類名 的格式填寫,提交即可。
至此,自定義函數就注冊完成了,可以去ODPS SQL節點里測試下這個UDF。
2.5 使用函數
三、后話
除了這種最簡單的UDF外,ODPS也支持UDTF和UDAF,詳情見表格:
UDF分類 描述
UDF(User Defined Scalar Function) 用戶自定義標量值函數(User Defined Scalar Function)。其輸入與輸出是一對一的關系,即讀入一行數據,寫出一條輸出值 。
UDTF(User Defined Table Valued Function) 自定義表值函數,是用來解決一次函數調用輸出多行數據場景的,也是唯一能返回多個字段的自定義函數。而UDF只能一次計算輸出一條返回值。
UDAF(User Defined Aggregation Function) 自定義聚合函數,其輸入與輸出是多對一的關系, 即將多條輸入記錄聚合成一條輸出值。可以與SQL中的Group By語句聯用。
如果之后有需求,可以嘗試寫寫UDTF和UDAF,這次到這里就結束啦。
————————————————
原文鏈接:https://blog.csdn.net/zhchs2012/article/details/89712537