創建函數(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_name

    函數的名稱。對於一個永久的函數,您可以選擇模式名稱的函數名。如果名字不是合格的永久的函數創建在當前模式。

  • function_parameter

    指定一個參數的函數。

    • parameter_name

      函數中的參數名稱必須是惟一的。

    • data_type

      任何受支持的數據類型。對於Python,data_type鑄造是一個Python數據類型根據呢語言映射

    • 默認的default_expression

      適用於:檢查標記是的磚的SQL檢查標記是的磚運行時10.4及以上

      使用一個可選的默認函數調用時不分配一個參數參數。default_expression必須可塑的data_type。表達式不能引用另一個參數或包含子查詢。

      當你為一個參數,指定一個默認的所有參數後也必須有一個默認。

      默認的支持語言SQL隻有。

    • 評論發表評論

      一個可選參數的描述。評論必須是一個字符串。

  • 返回data_type

    標量函數的返回數據類型。對於Python udf,返回值必須完全匹配的數據類型中指定data_type。否則將無法阻止意外的類型轉換函數。

  • 收益表(column_spec […])

    的簽名表函數的結果。返回支持語言SQL隻有。

    • column_name

      簽名中列名必須是唯一的。

    • data_type

      任何受支持的數據類型。

    • 評論column_comment

      一個可選的列的描述。評論必須是一個字符串。

  • 返回{表達式|查詢}

    的主體功能。對於一個標量函數,它可以是一個查詢或一個表達式。對於一個表函數,它隻能查詢。不能包含的表達式:

    身體內的函數可以參考參數的不合格由有資格的函數的參數名稱或名字。

  • 作為dollar_quoted_definition

    dollar_quoted_definition是Python函數身體附上兩個匹配[標記]身體美元[標記]美元標簽可以是一個空字符串。

    例子:

    $ $返回“Hello world”$ $ $ py返回“Hello world”py美元美元
  • 特征

    所有條款都是可選的特征。您可以指定任何數量的訂單,但您可以指定每個條款隻有一次。

    • 語言SQLPYTHON語言

      的語言功能的實現。

    • (不)確定的

      是否確定的函數。一個函數確定的時候隻返回一個結果對於一個給定的一組參數。

    • 評論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;0020——使用一個SQL WHERE子句的查詢功能。>選擇*t在哪裏區域(c1,c2)>0;12——編寫SQL函數。>創建函數廣場(x)返回返回區域(x,x);>選擇c1,廣場(c1)作為廣場t;000110——創建一個非確定函數>創建函數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_dicenum_dice,1),0,(acc,x)- >(蘭德()*roll_dicenum_sides)::int,acc- >acc+roll_dicenum_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;015135

創建一個SQL表函數

兩個日期之間——生產所有工作日>創建函數工作日(開始日期,結束日期)返回(day_of_week字符串,一天日期)返回選擇提取(DAYOFWEEK_ISO一天),一天(選擇序列(工作日開始,工作日結束))作為T()橫向視圖爆炸()作為一天在哪裏提取(DAYOFWEEK_ISO一天)之間的15;——返回所有工作日>選擇工作日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在哪裏edeptno=getempsdeptno;——描述一個SQL表函數。>描述函數getemps;函數:默認的getemps類型:輸入:deptnoINT返回:idINT的名字字符串

請注意

你不能取代現有的函數有不同的簽名。

描述一個SQL函數

>描述函數你好;函數:你好類型:標量輸入:()返回:字符串>描述函數區域;函數:默認的區域類型:標量輸入:xy返回:>描述函數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_dicenum_dice,1),0,(acc,x)- >(蘭德()*roll_dicenum_sides)::int,acc- >acc+roll_dicenum_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。沒有返回$ $