01-MaxCompute上的UDF(Python實現)


一、前言
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 -*-
from odps.udf import annotate
import re


@annotate("string->string")
class regxp_sign(object):
  def evaluate(self, sms_text):
    search_obj = re.search('【(.*?)】', sms_text)
    if search_obj:
      return search_obj.group(1)
    else:
      search_obj = re.search('\\[(.*?)\\]', sms_text)
    if search_obj:
      return search_obj.group(1)
    else:
      return None

 

 

 

 

 

 

 

 

 

 

 

 

解析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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM