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