创建函数(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。没有返回$ $