創建函數(SQL和Python)
適用於:磚的SQL磚運行時9.1及以上
創建一個SQL標量或表函數,它接受一組參數,並返回一個標量值或一組行。
適用於:磚的SQL磚運行時13.2及以上
創建一個Python標量函數,它接受一組參數,並返回標量值。
Python udf serverless或支持SQL倉庫需要統一目錄,或一個共享/分配統一目錄集群。
語法
創建(或取代](臨時]函數(如果不存在]function_name((function_parameter(,…]])返回{data_type|表(column_spec(,…])(特征(…]]{作為dollar_quoted_string|返回{表達式|查詢}}function_parameterparameter_namedata_type(默認的default_expression](評論parameter_comment]column_speccolumn_namedata_type(評論column_comment]特征{語言{SQL|PYTHON}|(不]確定的|評論function_comment|(包含SQL|讀取SQL數據]|SQL安全定義者}
參數
或替換
如果指定,該函數具有相同名稱和簽名(數量的參數和參數類型)取代。你不能取代現有的函數有不同的簽名。這主要是有用的更新函數體和函數的返回類型。你不能指定這個參數
如果不存在
。臨時
函數的範圍。當你指定
臨時
可見,創建的函數是有效的,在當前的會話。沒有持久的條目的目錄。如果不存在
如果指定,創建函數隻有當它不存在。函數的創建成功(沒有拋出錯誤)如果指定的功能係統中已經存在。你不能指定這個參數
或取代
。函數的名稱。對於一個永久的函數,您可以選擇模式名稱的函數名。如果名字不是合格的永久的函數創建在當前模式。
function_parameter
指定一個參數的函數。
標量函數的返回數據類型。對於Python udf,返回值必須完全匹配的數據類型中指定
data_type
。否則將無法阻止意外的類型轉換函數。收益表(column_spec […])
的簽名表函數的結果。
返回表
支持語言SQL
隻有。簽名中列名必須是唯一的。
任何受支持的數據類型。
評論column_comment
一個可選的列的描述。
評論
必須是一個字符串。
的主體功能。對於一個標量函數,它可以是一個查詢或一個表達式。對於一個表函數,它隻能查詢。不能包含的表達式:
身體內的函數可以參考參數的不合格由有資格的函數的參數名稱或名字。
作為dollar_quoted_definition
dollar_quoted_definition
是Python函數身體
附上兩個匹配[標記]身體美元[標記]美元
。標簽
可以是一個空字符串。例子:
$ $返回“Hello world”$ $ $ py返回“Hello world”py美元美元
特征
所有條款都是可選的特征。您可以指定任何數量的訂單,但您可以指定每個條款隻有一次。
語言SQL或PYTHON語言
的語言功能的實現。
(不)確定的
是否確定的函數。一個函數確定的時候隻返回一個結果對於一個給定的一組參數。
評論function_comment
函數的注釋。
function_comment
必須是字符串。包含SQL或讀取SQL數據
是否一個函數讀取數據直接或間接地從一個表或視圖。當函數讀取SQL數據時,您不能指定
包含SQL
。如果你不指定條款,財產來源於函數體。SQL安全定義者
函數的主體和任何默認表達式是使用所有者的授權執行的函數。這是唯一支持的行為。
在Python中udf支持庫
使用任何依賴項,使用進口<包>
在函數體中。例如,看到下麵的:
創建函數[…]$ $導入json […(其他函數定義))$ $
依賴關係僅限於標準Python庫和以下庫:
包 |
版本 |
---|---|
漂白劑 |
4.0.0 |
chardet |
4.0.0 |
charset-normalizer |
2.0.4 |
defusedxml |
是0.7.1 |
googleapis-common-protos |
1.56.4 |
grpcio |
1.47.0 |
grpcio-status |
1.47.0 |
jmespath |
0.10.0 |
joblib |
1.1.0 |
numpy |
1.20.3 |
包裝 |
21.3 |
熊貓 |
1.3.4 |
容易受騙的人 |
0.5.2 |
protobuf |
4.21.5 |
pyarrow |
7.0.0 |
pyparsing |
3.0.9 |
python-dateutil |
2.8.2 |
pytz |
2021.3 |
scikit-learn |
0.24.2” |
scipy |
1.7.1上” |
setuptools |
65.2.0 |
六個 |
1.16.0 |
threadpoolctl |
3.1.0 |
webencodings |
0.5.1 |
用戶代理 |
2.2.0 |
密碼學 |
38.0.4 |
例子
創建和使用一個SQL標量函數
>創建視圖t(c1,c2)作為值(0,1),(1,2);
——創建一個臨時函數沒有參數。>創建臨時函數你好()返回字符串返回“Hello World !”;>選擇你好();你好世界!——創建一個永久的函數參數。>創建函數區域(x雙,y雙)返回雙返回x*y;——使用一個SQL SELECT子句的查詢功能。>選擇區域(c1,c2)作為區域從t;0。02。0——使用一個SQL WHERE子句的查詢功能。>選擇*從t在哪裏區域(c1,c2)>0;12——編寫SQL函數。>創建函數廣場(x雙)返回雙返回區域(x,x);>選擇c1,廣場(c1)作為廣場從t;00。011。0——創建一個非確定函數>創建函數roll_dice()返回INT不確定的包含SQL評論“一個六麵骰子滾”返回(蘭德()*6)::INT+1;——一個六麵骰子滾>選擇roll_dice();3
創建和使用一個函數,使用默認值
——擴展函數支持變量,骰子。——使用默認支持數量可變的參數>下降函數roll_dice;>創建函數roll_dice(num_diceINT默認的1評論骰子滾的數量(默認值:1)”,num_sidesINT默認的6評論“每個死亡的邊數(默認值:6)”)返回INT不確定的包含SQL評論“許多n-sided骰子滾”返回總(序列(1,roll_dice。num_dice,1),0,(acc,x)- >(蘭德()*roll_dice。num_sides)::int,acc- >acc+roll_dice。num_dice);——一個六麵骰子滾仍能工作>選擇roll_dice();3——卷3六麵骰子>選擇roll_dice(3);15——卷3 10-sided骰子>選擇roll_dice(3,10)21——創建一個SQL函數標量子查詢。>創建視圖分數(球員,分數)作為值(0,1),(0,2),(1,2),(1,5);>創建函數avg_score(pINT)返回浮動評論得到一個平均得分的球員的返回選擇AVG(分數)從分數在哪裏球員=p;>選擇c1,avg_score(c1)從t;01。513。5
創建一個SQL表函數
兩個日期之間——生產所有工作日>創建函數工作日(開始日期,結束日期)返回表(day_of_week字符串,一天日期)返回選擇提取(DAYOFWEEK_ISO從一天),一天從(選擇序列(工作日。開始,工作日。結束))作為T(天)橫向視圖爆炸(天)作為一天在哪裏提取(DAYOFWEEK_ISO從一天)之間的1和5;——返回所有工作日>選擇工作日。day_of_week,一天從工作日(日期“2022-01-01”,日期“2022-01-14”);12022年- - - - - -01- - - - - -0322022年- - - - - -01- - - - - -0432022年- - - - - -01- - - - - -05年42022年- - - - - -01- - - - - -0652022年- - - - - -01- - - - - -07年12022年- - - - - -01- - - - - -1022022年- - - - - -01- - - - - -1132022年- - - - - -01- - - - - -1242022年- - - - - -01- - - - - -1352022年- - - - - -01- - - - - -14——返回工作日日期範圍來自橫向相關性>選擇工作日。*從值(日期“2020-01-01”),(日期“2021-01-01”),(日期“2022-01-01”)作為開始(開始),橫向工作日(開始,開始+時間間隔“7”天);32020年- - - - - -01- - - - - -0142020年- - - - - -01- - - - - -0252020年- - - - - -01- - - - - -0312020年- - - - - -01- - - - - -0622020年- - - - - -01- - - - - -07年32020年- - - - - -01- - - - - -08年52021年- - - - - -01- - - - - -0112021年- - - - - -01- - - - - -0422021年- - - - - -01- - - - - -05年32021年- - - - - -01- - - - - -0642021年- - - - - -01- - - - - -07年52021年- - - - - -01- - - - - -08年12022年- - - - - -01- - - - - -0322022年- - - - - -01- - - - - -0432022年- - - - - -01- - - - - -05年42022年- - - - - -01- - - - - -0652022年- - - - - -01- - - - - -07年
替換SQL函數
——替換SQL標量函數。>創建或取代函數廣場(x雙)返回雙返回x*x;——替換SQL表函數。>創建或取代函數getemps(deptnoINT)返回表(的名字字符串)返回選擇的名字從員工e在哪裏e。deptno=getemps。deptno;——描述一個SQL表函數。>描述函數getemps;函數:默認的。getemps類型:表輸入:deptnoINT返回:idINT的名字字符串
請注意
你不能取代現有的函數有不同的簽名。
描述一個SQL函數
>描述函數你好;函數:你好類型:標量輸入:()返回:字符串>描述函數區域;函數:默認的。區域類型:標量輸入:x雙y雙返回:雙>描述函數roll_dice;函數:默認的。roll_dice類型:標量輸入:num_diceINTnum_sidesINT返回:INT>描述函數擴展roll_dice;函數:默認的。roll_dice類型:標量輸入:num_diceINT默認的1骰子滾的數量(默認值:1)”num_sidesINT默認的6“每個骰子的方數(默認值:6)返回:INT評論:卷一個數量的米- - - - - -站骰子確定的:假數據訪問:包含SQL配置:…老板:的。房子@總是。贏了創建時間:坐2月1209年:29日:02太平洋標準時間2022年身體:總(序列(1,roll_dice。num_dice,1),0,(acc,x)- >(蘭德()*roll_dice。num_sides)::int,acc- >acc+roll_dice。num_dice)
創建Python函數
——你好世界功能使用Python udf >創建函數main.default.greet(字符串)返回字符串語言Python $ $ def問候(名稱):返回“Hello”+名稱+“!”返回迎接(s)如果其他年代沒有$ $——可以從性病導入函數庫和環境>創建函數main.default.isleapyear (INT)返回布爾語言Python作為$ $導入日曆返回calendar.isleap(年)如果其他沒有$ $——必須返回正確的類型。否則將在運行時失敗。>創建函數main.default.a_number()返回整數語言PYTHON $ $ #不工作:返回“10”#不工作:返回3.14返回10 $ $,處理異常。>創建函數main.default.custom_divide (INT n1、n2 INT)返回浮動語言PYTHON $ $試題:返回n1、n2除了ZeroDivisionException: # 0,我們可以返回NULL。沒有返回$ $