介绍SQL用户定义函数
通过<一个data-external-link="true" href="//www.neidfyre.com/www/blog/author/serge-rielau" aria-label="Serge Rielau">哔叽Rielau一个>和<一个data-external-link="true" href="//www.neidfyre.com/www/blog/author/allison-wang" aria-label="Allison Wang">Allison王一个>
2021年10月20日
在bob体育客户端下载平台的博客一个>
2021年10月20日
一个用户定义的函数(UDF)是一个对用户扩展本机功能意味着Apache的火花™SQL。SQL数据砖支持外部用户定义函数写在Scala中,Java、Python和R 1.3.0以来编程语言版本。虽然外部udf是非常强大的,他们也有一些注意事项:
- 安全gydF4y2Ba。外部语言编写的一个UDF可以执行危险甚至恶意代码。这需要严格控制谁可以创建UDF。
- 性能gydF4y2Ba。udf的黑匣子<一个href="//www.neidfyre.com/www/glossary/catalyst-optimizer" rel="noopener noreferrer" target="_blank">催化剂优化器一个>。鉴于催化剂不知道一个UDF的内部运作,它不能做任何工作来提高性能的UDF的上下文中一个SQL查询。
- SQL的可用性。gydF4y2Ba为SQL用户可以麻烦在宿主语言编写udf在火花然后注册它们。同样,有一组扩展许多用户可能想让SQL相当简单,开发外部UDF是过火了。
应对上述局限性,我们很高兴向大家介绍一种新形式的UDF: SQL UDF。<一个href="//www.neidfyre.com/docs/spark/latest/spark-sql/language-manual/sql-ref-syntax-ddl-create-sql-function.html" rel="noopener noreferrer" target="_blank">DBR 9.1 LTS, SQL UDF一个>完全的表达能力与定义SQL和SQL编译器也完全透明。
检查<一个href="//www.neidfyre.com/www/resources/ebook/bring-data-warehousing-data-lakes?itm_data=sqluserdefinedfunctions-blog-whylakehouseisnextdw" target="_blank">为什么Lakehouse的数据是你的下一个数据仓库的电子书一个>发现砖的内部运作Lakehouse平台。bob体育客户端下载
使用SQL udf的好处
SQL udf是简单而强大的扩展SQL数据砖。功能,提供一个抽象层,简化查询构造SQL查询,可读性更强,模块化。与用非SQL语言编写udf, SQL udf更轻量级的SQL用户创建。SQL函数的身体是透明的高性能查询优化器从而使他们比外部udf。SQL udf可以创建临时或永久性功能,被重用在多个查询,会话和用户,通过访问控制访问权限控制的已命名的语言(ACL)。在这个博客中,我们将介绍一些关键用例通过示例SQL udf。
SQL udf作为常量
让我们先从最简单的函数可以想象:一个常数。我们都知道我们不应该在我们的代码使用文本,因为它损害了可读性,谁知道呢,也许常数不保持不变。所以我们希望能够改变它只在一个地方:
创建跨度><跨度>跨度><跨风格="color:#a71d5d">函数跨度><跨度>蓝色()跨度><跨度>跨度><跨风格="color:#a71d5d">返回跨度><跨度>字符串跨度><跨度>评论跨度><跨风格="color:#183691">“蓝色代码”跨度><跨度>跨度><跨度>语言跨度><跨度>跨度><跨风格="color:#a71d5d">SQL跨度><跨度>跨度><跨度>返回跨度><跨度>跨度><跨风格="color:#183691">0000 ff跨度><跨度>跨度>
如果您熟悉外部udf,您可以看到有一些差异,突出:
- 一个SQL UDF必须定义其参数列表,即使它是空的。一个常数不接受参数。
- 函数还声明它将返回的数据类型。在这种情况下这是一个字符串。
- 函数的实现函数定义的一部分。
- 指定语言SQL说,这是一个SQL UDF。但实际上,这不是必要的。RETURN子句是足够的放弃,我们决定将这个可选。
除了这些差异还有很多其他事情一样外部UDF:
- 你可以换一个函数。稍后将进行更详细的讨论。
- 您可以添加注释,描述函数——如上所示。
- 你甚至可以创建一个临时的函数,您可以使用在当前会话中,。
让我们使用这个函数:
选择跨度><跨度class="hljs-function" style="color:#458;font-weight:bold">蓝色的跨度><跨度class="hljs-function" style="color:#0086b3">()跨度><跨度>;0000年ff代码>
毫无疑问这个作品。但在引擎盖下面发生了什么?
解释选择蓝色();= = = =物理计划<跨度>*( <跨风格="color:#0086b3">1跨度><跨度>)项目(跨度><跨风格="color:#0086b3">0000年跨度><跨度>FF<跨风格="color:#a71d5d">作为跨度><跨度>跨度><跨风格="color:#a71d5d">默认的跨度><跨度>.blue ()跨度><跨风格="color:#408080;font-style:italic"># 9)跨度><跨度>跨度><跨度>+ - * (跨度><跨风格="color:#0086b3">1跨度><跨度>)扫描OneRowRelation []跨度>代码>
这是整洁!SQL编译器取代常数的函数调用本身。
gydF4y2Ba这意味着至少这SQL UDF零代价性能。
现在,让我们来看看另一个常见的使用模式。
SQL UDF封装表达式
想象一下你不喜欢一些内置函数的命名。也许你是迁移大量查询从另一个产品,不同的函数名和行为。或者你只是受不了复制粘贴一些冗长的表达一遍又一遍地在您的SQL查询。所以,你想解决这个问题。
使用SQL UDF,我们可以简单地创建一个新的函数的名字:
创建跨度><跨度>跨度><跨风格="color:#a71d5d">函数跨度><跨度>来_hex (x跨度><跨风格="color:#0086b3">INT跨度><跨度>评论跨度><跨风格="color:#183691">0 - 255之间的任意数量的跨度><跨度>)<跨度>跨度><跨风格="color:#a71d5d">返回跨度><跨度>字符串跨度><跨度>评论跨度><跨风格="color:#183691">“将一个十进制转换为十六进制”跨度><跨度>跨度><跨度>包含跨度><跨度>跨度><跨风格="color:#a71d5d">SQL跨度><跨度>跨度><跨风格="color:#a71d5d">确定的跨度><跨度>跨度><跨度>返回跨度><跨度>lpad(十六进制(最小(最大(跨度><跨风格="color:#0086b3">0跨度><跨度>,x),跨度><跨风格="color:#0086b3">255年跨度><跨度>)),<跨风格="color:#0086b3">2跨度><跨度>,<跨风格="color:#0086b3">0跨度><跨度>)代码>
让我们来看看使用新语法:
- 这个函数接受一个参数,参数被定义为一个名字,一个类型和一个可选的评论。
- 包含SQL子句是可选的,但告诉我们的函数并不表中读取或修改任何数据。这是默认设置,所以你通常不会指定它。
- 确定性也是可选的,并且告诉我们,这个函数将始终返回相同的结果集给出相同的参数。该条款仅供文档。但是在将来的某个时候它可能被用来阻止非确定性函数在某些情况下。
- 在RETURN子句的参数通过名称引用。在更复杂的场景下面你会发现函数的参数可以得到消除了歧义的名字。自然可以使用任意复杂的表达式作为函数体。
它不仅工作…
选择跨度><跨度>来_hex (id)跨度><跨风格="color:#a71d5d">从跨度><跨度>跨度><跨风格="color:#a71d5d">范围跨度><跨度>(<跨风格="color:#0086b3">2跨度><跨度>);<跨度>跨度><跨风格="color:#0086b3">00跨度><跨度>跨度><跨度>01跨度><跨度>跨度>
…但它工作得很好:
解释跨度><跨风格="color:#a71d5d">选择跨度><跨度>来_hex (id)跨度><跨风格="color:#a71d5d">从跨度><跨度>跨度><跨风格="color:#a71d5d">范围跨度><跨度>(<跨风格="color:#0086b3">2跨度><跨度>);<跨度>跨度><跨度 class="hljs-operator">=跨度><跨度class="hljs-operator">=跨度><跨度>物理计划跨度><跨度class="hljs-operator">=跨度><跨度class="hljs-operator">=跨度><跨度>跨度><跨度>*跨度><跨度>(<跨风格="color:#0086b3">1跨度><跨度>)项目(lpad(十六进制(跨度><跨风格="color:#0086b3">投跨度><跨度>(最小(最大(跨度><跨风格="color:#0086b3">0跨度><跨度>,<跨风格="color:#0086b3">投跨度><跨度>(id #跨度><跨风格="color:#0086b3">0跨度><跨度>跨度><跨风格="color:#a71d5d">作为跨度><跨度>跨度><跨风格="color:#0086b3">int跨度><跨度>)),<跨风格="color:#0086b3">255年跨度><跨度>)<跨风格="color:#a71d5d">作为跨度><跨度>跨度><跨风格="color:#0086b3">长整型数字跨度><跨度>)),<跨风格="color:#0086b3">2跨度><跨度>,<跨风格="color:#0086b3">0跨度><跨度>)<跨风格="color:#a71d5d">作为跨度><跨度>默认的.to_hex (id) #跨度><跨风格="color:#0086b3">1跨度><跨度>]<跨度>跨度><跨度 class="hljs-operator">+跨度><跨度class="hljs-operator">- - - - - -跨度><跨度>跨度><跨度 class="hljs-operator">*跨度><跨度>(<跨风格="color:#0086b3">1跨度><跨度>)<跨风格="color:#a71d5d">范围跨度><跨度>(<跨风格="color:#0086b3">0跨度><跨度>,<跨风格="color:#0086b3">2跨度><跨度>,一步跨度><跨度class="hljs-operator">=跨度><跨风格="color:#0086b3">1跨度><跨度>,分裂跨度><跨度class="hljs-operator">=跨度><跨风格="color:#0086b3">4跨度><跨度>)代码>
我们可以看到,连续物理计划显示了应用程序的功能lpad,十六进制,最小和最大。这是相同的计划直接调用一系列的功能。
您还可以编写SQL函数的SQL函数:
创建跨度><跨度class="hljs-function" style="color:#a71d5d">函数跨度><跨度class="hljs-function">rgb_to_hex跨度><跨度class="hljs-function">(跨度><跨度class="hljs-function" style="color:#0086b3">r跨度><跨度class="hljs-function" style="color:#a71d5d">INT跨度><跨度class="hljs-function" style="color:#0086b3">g跨度><跨度class="hljs-function" style="color:#a71d5d">INT跨度><跨度class="hljs-function" style="color:#0086b3">b跨度><跨度class="hljs-function" style="color:#a71d5d">INT跨度><跨度class="hljs-function">)跨度><跨度class="hljs-function">返回跨度><跨度class="hljs-function">字符串跨度><跨度class="hljs-function">评论跨度><跨度class="hljs-function">”跨度><跨度class="hljs-function" style="color:#458;font-weight:bold">转换跨度><跨度class="hljs-function">一个跨度><跨度class="hljs-function">RGB跨度><跨度class="hljs-function">颜色跨度><跨度class="hljs-function">来跨度><跨度class="hljs-function">一个跨度><跨度class="hljs-function">十六进制跨度><跨度class="hljs-function">颜色跨度><跨度class="hljs-function">代码跨度><跨度class="hljs-function">”跨度><跨度class="hljs-function">返回跨度><跨度class="hljs-function">CONCAT跨度><跨度class="hljs-function">(跨度><跨度class="hljs-function" style="color:#0086b3">to_hex (跨度><跨度class="hljs-function" style="color:#0086b3">r跨度><跨度class="hljs-function" style="color:#0086b3">),to_hex (跨度><跨度class="hljs-function" style="color:#0086b3">g跨度><跨度class="hljs-function" style="color:#0086b3">),to_hex (跨度><跨度class="hljs-function" style="color:#0086b3">b跨度><跨度class="hljs-function" style="color:#0086b3">)跨度><跨度class="hljs-function">)跨度><跨度class="hljs-function">选择跨度><跨度class="hljs-function">rgb_to_hex跨度><跨度class="hljs-function">(跨度><跨度class="hljs-function" style="color:#0086b3">0跨度><跨度class="hljs-function" style="color:#0086b3">,跨度><跨度class="hljs-function" style="color:#0086b3">0跨度><跨度class="hljs-function" style="color:#0086b3">,跨度><跨度class="hljs-function" style="color:#0086b3">255年跨度><跨度class="hljs-function">)跨度><跨度>;<跨度>跨度><跨风格="color:#0086b3">0000年跨度><跨度>FF代码>
SQL UDF读取表
SQL UDF的另一个常见用法是编纂查找。一个简单的查询可能是RGB颜色编码解码成英文颜色名称:
创建跨度><跨度>跨度><跨风格="color:#a71d5d">函数跨度><跨度>from_rgb (rgb字符串跨度><跨度>评论跨度><跨风格="color:#183691">“一个RGB十六进制颜色代码”跨度><跨度>)<跨度>跨度><跨风格="color:#a71d5d">返回跨度><跨度>字符串跨度><跨度>评论跨度><跨风格="color:#183691">“将一个RGB颜色代码转换为颜色名称”跨度><跨度>跨度><跨度>返回跨度><跨度>解码(rgb,跨度><跨风格="color:#183691">“就”跨度><跨度>,<跨风格="color:#183691">“红色”跨度><跨度>,<跨度>跨度><跨风格="color:#183691">“FF0080”跨度><跨度>,<跨风格="color:#183691">“玫瑰”跨度><跨度>);<跨度>跨度><跨风格="color:#a71d5d">选择跨度><跨度>from_rgb (跨度><跨风格="color:#183691">“FF0080”跨度><跨度>);玫瑰代码>
好吧,但是有很多超过两种颜色在这个世界上。我们希望这个翻译是双向的,所以这应该是一个查找表:
创建跨度><跨度>跨度><跨风格="color:#a71d5d">表跨度><跨度>颜色(rgb字符串跨度><跨风格="color:#a71d5d">不跨度><跨度>跨度><跨风格="color:#a71d5d">零跨度><跨度>、名称字符串跨度><跨风格="color:#a71d5d">不跨度><跨度>跨度><跨风格="color:#a71d5d">零跨度><跨度>);<跨度>跨度><跨风格="color:#a71d5d">插入跨度><跨度>跨度><跨风格="color:#a71d5d">成跨度><跨度>颜色跨度><跨风格="color:#a71d5d">值跨度><跨度>跨度><跨度>(跨度><跨风格="color:#183691">“就”跨度><跨度>,<跨风格="color:#183691">“红色”跨度><跨度>),<跨度>(<跨风格="color:#183691">“FF0080”跨度><跨度>,<跨风格="color:#183691">“玫瑰”跨度><跨度>),<跨度>(<跨风格="color:#183691">“BFFF00”跨度><跨度>,<跨风格="color:#183691">“石灰”跨度><跨度>),<跨度>(<跨风格="color:#183691">“7 df9ff”跨度><跨度>,<跨风格="color:#183691">铁蓝色的跨度><跨度>);<跨度>跨度><跨风格="color:#a71d5d">创建跨度><跨度>跨度><跨风格="color:#a71d5d">或跨度><跨度>取代跨度><跨风格="color:#a71d5d">函数跨度><跨度>跨度><跨度>from_rgb (rgb字符串发表评论跨度><跨风格="color:#183691">“一个RGB十六进制颜色代码”跨度><跨度>)<跨度>跨度><跨风格="color:#a71d5d">返回跨度><跨度>字符串跨度><跨度>跨度><跨风格="color:#a71d5d">读取跨度><跨度>跨度><跨风格="color:#a71d5d">SQL跨度><跨度>数据跨度><跨风格="color:#a71d5d">SQL跨度><跨度>安全定义者跨度><跨度>评论跨度><跨风格="color:#183691">“将一个RGB颜色代码转换为颜色名称”跨度><跨度>跨度><跨度>返回跨度><跨度>跨度><跨风格="color:#a71d5d">选择跨度><跨度>跨度><跨风格="color:#a71d5d">第一个跨度><跨度>(名字)跨度><跨风格="color:#a71d5d">从跨度><跨度>颜色跨度><跨风格="color:#a71d5d">在哪里跨度><跨度>rgb<跨度class="hljs-operator">=跨度><跨度>from_rgb.rgb;选择跨度><跨度>from_rgb (rgb)跨度><跨度>跨度><跨风格="color:#a71d5d">从跨度><跨度>跨度><跨风格="color:#a71d5d">值跨度><跨度>(<跨风格="color:#183691">“7 df9ff”跨度><跨度>),<跨度>(<跨风格="color:#183691">“BFFF00”跨度><跨度>)<跨风格="color:#a71d5d">作为跨度><跨度>代码(rgb);跨度>铁蓝色石灰代码>
这里有很多新概念应用:
- 你可以换一个SQL UDF。可以这样做,新功能必须与旧功能的签名。函数的签名被定义为它的参数的数量和类型。
- 这个函数查找表中的信息,所以你可以选择使用读取SQL数据的文档。如果你国家没有SQL编译器将得到正确的值,但是你不能撒谎和状态包含SQL。
- SQL安全定义者是另一个可选的条款,即查询访问函数的颜色表将使用授权所有者。所以这个函数可以执行的公共的安全的前提下表。
- 就像函数操作的授权下主人总是会解析使用当前数据库时创建。
- “rgb”的名称列数字。由符合条件的参数“from_rgb”。rgb你澄清一下,你的意思是参数的引用,而不是列。
现在身体如何计划看起来像吗?很容易看到,使用外部UDF,本身执行一个查询,会导致一个嵌套循环联接,是一个可怕的方式消耗宝贵的资源。
解释跨度><跨风格="color:#a71d5d">选择跨度><跨度>from_rgb (rgb)跨度><跨度>跨度><跨风格="color:#a71d5d">从跨度><跨度>跨度><跨风格="color:#a71d5d">值跨度><跨度>(<跨风格="color:#183691">“7 df9ff”跨度><跨度>),<跨度>(<跨风格="color:#183691">“BFFF00”跨度><跨度>)<跨风格="color:#a71d5d">作为跨度><跨度>代码(rgb);跨度><跨度>跨度><跨度 class="hljs-operator">=跨度><跨度class="hljs-operator">=跨度><跨度>物理计划跨度><跨度class="hljs-operator">=跨度><跨度class="hljs-operator">=跨度><跨度>跨度><跨度>AdaptiveSparkPlan isFinalPlan跨度><跨度class="hljs-operator">=跨度><跨风格="color:#954121">假跨度><跨度>跨度><跨度>+跨度><跨度class="hljs-operator">- - - - - -跨度><跨度>项目(跨度><跨风格="color:#a71d5d">第一个跨度><跨度>(名字)#跨度><跨风格="color:#0086b3">1322268跨度><跨度>跨度><跨风格="color:#a71d5d">作为跨度><跨度>默认的.from_rgb (rgb) #跨度><跨风格="color:#0086b3">1322259跨度><跨度>]<跨度>跨度><跨度 class="hljs-operator">+跨度><跨度class="hljs-operator">- - - - - -跨度><跨度>BroadcastHashJoin (rgb #跨度><跨风格="color:#0086b3">1322261跨度><跨度>]、[rgb #跨度><跨风格="color:#0086b3">1322266跨度><跨度>),LeftOuter BuildRight,跨度><跨风格="color:#954121">假跨度><跨度>跨度><跨度>:跨度><跨度class="hljs-operator">- - - - - -跨度><跨度>LocalTableScan (rgb #跨度><跨风格="color:#0086b3">1322261跨度><跨度>]<跨度>跨度><跨度 class="hljs-operator">+跨度><跨度class="hljs-operator">- - - - - -跨度><跨度>BroadcastExchange HashedRelationBroadcastMode (ArrayBuffer(输入(跨度><跨风格="color:#0086b3">1跨度><跨度>字符串,跨度><跨风格="color:#954121">假跨度><跨度>]),<跨风格="color:#954121">假跨度><跨度>),[id跨度><跨度class="hljs-operator">=跨度><跨度>#<跨风格="color:#0086b3">1437557跨度><跨度>]<跨度>跨度><跨度 class="hljs-operator">+跨度><跨度class="hljs-operator">- - - - - -跨度><跨度>SortAggregate(关键跨度><跨度class="hljs-operator">=跨度><跨度>(rgb#<跨风格="color:#0086b3">1322266跨度><跨度>),功能跨度><跨度class="hljs-operator">=跨度><跨度>[finalmerge_first (跨度><跨风格="color:#a71d5d">合并跨度><跨度>跨度><跨风格="color:#a71d5d">第一个跨度><跨度>#<跨风格="color:#0086b3">1322271跨度><跨度>,valueSet #跨度><跨风格="color:#0086b3">1322272跨度><跨度>)<跨风格="color:#a71d5d">作为跨度><跨度>跨度><跨风格="color:#a71d5d">第一个跨度><跨度>(名字#跨度><跨风格="color:#0086b3">1322267跨度><跨度>)()#<跨风格="color:#0086b3">1322260跨度><跨度>])<跨度>跨度><跨度 class="hljs-operator">+跨度><跨度class="hljs-operator">- - - - - -跨度><跨度>排序(rgb #跨度><跨风格="color:#0086b3">1322266跨度><跨度>跨度><跨风格="color:#a71d5d">ASC跨度><跨度>零位跨度><跨风格="color:#a71d5d">第一个跨度><跨度>),<跨风格="color:#954121">假跨度><跨度>,<跨风格="color:#0086b3">0跨度><跨度>跨度><跨度>+跨度><跨度class="hljs-operator">- - - - - -跨度><跨度>交换hashpartitioning (rgb #跨度><跨风格="color:#0086b3">1322266跨度><跨度>,<跨风格="color:#0086b3">200年跨度><跨度>)、ENSURE_REQUIREMENTS [id跨度><跨度class="hljs-operator">=跨度><跨度>#<跨风格="color:#0086b3">1437553跨度><跨度>]<跨度>跨度><跨度 class="hljs-operator">+跨度><跨度class="hljs-operator">- - - - - -跨度><跨度>SortAggregate(关键跨度><跨度class="hljs-operator">=跨度><跨度>(rgb#<跨风格="color:#0086b3">1322266跨度><跨度>),功能跨度><跨度class="hljs-operator">=跨度><跨度>[partial_first(名字#跨度><跨风格="color:#0086b3">1322267跨度><跨度>,<跨风格="color:#954121">假跨度><跨度>)<跨风格="color:#a71d5d">作为跨度><跨度>(<跨风格="color:#a71d5d">第一个跨度><跨度>#<跨风格="color:#0086b3">1322271跨度><跨度>,valueSet #跨度><跨风格="color:#0086b3">1322272跨度><跨度>)))<跨度>跨度><跨度 class="hljs-operator">+跨度><跨度class="hljs-operator">- - - - - -跨度><跨度>排序(rgb #跨度><跨风格="color:#0086b3">1322266跨度><跨度>跨度><跨风格="color:#a71d5d">ASC跨度><跨度>零位跨度><跨风格="color:#a71d5d">第一个跨度><跨度>),<跨风格="color:#954121">假跨度><跨度>,<跨风格="color:#0086b3">0跨度><跨度>跨度><跨度>+跨度><跨度class="hljs-operator">- - - - - -跨度><跨度>FileScan铺default.colors (rgb #跨度><跨风格="color:#0086b3">1322266跨度><跨度>、名称#跨度><跨风格="color:#0086b3">1322267跨度><跨度>]代码>
在这种情况下,催化剂选择广播散列连接,而不是一个嵌套循环联接。它可以这样做是因为它理解SQL UDF的内容。
到目前为止,使用的所有例子讨论了纯量值函数,返回一个值。这个结果可能是任何类型的,甚至复杂的组合结构,数组和地图。也有另一种类型的UDF讨论——表值UDF。
SQL表UDF
想象一下,如果把观点!你可以封装复杂的谓词,即使他们依靠用户提供的值。SQL表UDF是:一个视图的任何其他名字,除了参数。
假设上面的颜色映射并不是唯一的。至少,我们可以断言颜色名称都有各自不同的语言。
因此“from_rgb”功能需要修改返回数组的名字或关系。
插入跨度><跨度>跨度><跨风格="color:#a71d5d">成跨度><跨度>颜色跨度><跨风格="color:#a71d5d">值跨度><跨度>(<跨风格="color:#183691">“BFFF00”跨度><跨度>,<跨风格="color:#183691">“citron绿色”跨度><跨度>);创建跨度><跨度>跨度><跨风格="color:#a71d5d">或跨度><跨度>取代跨度><跨风格="color:#a71d5d">函数跨度><跨度>跨度><跨度>from_rgb (rgb字符串发表评论跨度><跨风格="color:#183691">“一个RGB十六进制颜色代码”跨度><跨度>)<跨度>跨度><跨风格="color:#a71d5d">返回跨度><跨度>跨度><跨风格="color:#a71d5d">表跨度><跨度>(名称字符串评论跨度><跨风格="color:#183691">的颜色名称跨度><跨度>)<跨度>跨度><跨风格="color:#a71d5d">读取跨度><跨度>跨度><跨风格="color:#a71d5d">SQL跨度><跨度>数据跨度><跨风格="color:#a71d5d">SQL跨度><跨度>安全定义者跨度><跨度>评论跨度><跨风格="color:#183691">“将一个RGB颜色代码转换为颜色名称”跨度><跨度>跨度><跨度>返回跨度><跨度>跨度><跨风格="color:#a71d5d">选择跨度><跨度>的名字跨度><跨风格="color:#a71d5d">从跨度><跨度>颜色跨度><跨风格="color:#a71d5d">在哪里跨度><跨度>rgb<跨度class="hljs-operator">=跨度><跨度>from_rgb.rgb;代码>
正如你所看到的,唯一的区别比一个标量函数是一个更复杂的回报条款。与视图、SQL udf授权声明返回的关系的签名:
- 表指定函数返回一个关系。
- 表的条款必须包含一个名称为每个返回列和列的数据类型。
- 你可以选择指定任何返回列的评论。
用户定义的表函数是DBR。让我们看一看如何调用它们。
选择跨度><跨度>跨度><跨度 class="hljs-operator">*跨度><跨度>跨度><跨风格="color:#a71d5d">从跨度><跨度>from_rgb (跨度><跨风格="color:#183691">“7 df9ff”跨度><跨度>);铁蓝色代码>
在其最简单的形式,一个表函数调用以同样的方式和相同的地方引用。唯一的区别是强制性的牙套,包括函数的参数。这个函数调用与文字的论点,但参数可以是任何表达式,甚至标量子查询。
然而,最强大的是使用SQL表UDF的加入,通常相关的交叉连接:
选择跨度><跨度>rgb,from_rgb.name跨度><跨度>跨度><跨风格="color:#a71d5d">从跨度><跨度>跨度><跨风格="color:#a71d5d">值跨度><跨度>(<跨风格="color:#183691">“7 df9ff”跨度><跨度>),<跨度>(<跨风格="color:#183691">“BFFF00”跨度><跨度>)<跨风格="color:#a71d5d">作为跨度><跨度>编码(rgb),跨度><跨度>跨度><跨风格="color:#a71d5d">横向跨度><跨度>from_rgb (codes.rgb);跨度><跨度>跨度><跨度 class="hljs-operator"><跨度><跨度>跨风格跨度><跨度class="hljs-operator">=跨度><跨度>“颜色:黑色!重要;”跨度><跨度class="hljs-operator">>跨度><跨风格="color:#0086b3">7跨度><跨度>DF9FF<跨度class="hljs-operator"><跨度><跨度class="hljs-operator">/跨度><跨度>跨度跨度><跨度class="hljs-operator">>跨度><跨度>铁蓝色跨度>BFFF00石灰BFFF00 citron绿色代码>
这里引用的参数(关联)前(侧)关系在FROM子句中。新<一个href="//www.neidfyre.com/docs/release-notes/runtime/9.0.html" rel="noopener noreferrer" target="_blank">横向关键字一个>允许催化剂来解决这些列。还要注意,您可以参考的结果表函数的命名定义的列在结果签名和选择合格的函数名。
政府
自然,SQL udf完全支持现有的格兰特,撤销,节目,描述和语句。
声明值得指出详细描述。
描述跨度><跨度>跨度><跨风格="color:#a71d5d">函数跨度><跨度>from_rgb;<跨度>跨度><跨风格="color:#a71d5d">函数跨度><跨度>:默认的.from_rgb跨度><跨度>类型:跨度><跨风格="color:#a71d5d">表跨度><跨度>跨度>输入:rgb字符串<跨度>跨度><跨风格="color:#a71d5d">返回跨度><跨度>:名称字符串跨度>代码>
基本描述您所期望的回报,但扩展描述添加更多的细节:
描述跨度><跨度>跨度><跨风格="color:#a71d5d">函数跨度><跨度>扩展from_rgb;跨度><跨度>跨度><跨风格="color:#a71d5d">函数跨度><跨度>:默认的.from_rgb跨度><跨度>类型:跨度><跨风格="color:#a71d5d">表跨度><跨度>跨度><跨度>输入:rgb字符串跨度><跨风格="color:#183691">“一个RGB十六进制颜色代码”跨度><跨度>跨度><跨度>返回跨度><跨度>:名称字符串跨度><跨风格="color:#183691">的颜色名称跨度><跨度>跨度><跨度>备注:翻译一个RGB颜色代码跨度><跨风格="color:#a71d5d">成跨度><跨度>一个颜色的名字跨度><跨度>数据访问:跨度><跨风格="color:#a71d5d">读取跨度><跨度>跨度><跨风格="color:#a71d5d">SQL跨度><跨度>数据跨度><跨度>配置:spark.sql.datetime.java8API.enabled跨度><跨度class="hljs-operator">=跨度><跨风格="color:#954121">真正的跨度><跨度>跨度><跨度>spark.sql.hive.version跨度><跨度class="hljs-operator">=跨度><跨风格="color:#0086b3">2.3跨度><跨风格="color:#0086b3">。7跨度><跨度>跨度>老板:serge.rielau<跨度>跨度><跨风格="color:#a71d5d">创建跨度><跨度>跨度><跨风格="color:#0086b3">时间跨度><跨度>:9月结婚跨度><跨风格="color:#0086b3">08年跨度><跨度>跨度><跨风格="color:#0086b3">08年跨度><跨度>:<跨风格="color:#0086b3">59跨度><跨度>:<跨风格="color:#0086b3">53跨度><跨度>PDT<跨风格="color:#0086b3">2021年跨度><跨度>跨度><跨度>身体:跨度><跨风格="color:#a71d5d">选择跨度><跨度>的名字跨度><跨风格="color:#a71d5d">从跨度><跨度>颜色跨度><跨风格="color:#a71d5d">在哪里跨度><跨度>rgb<跨度class="hljs-operator">=跨度><跨度>from_rgb.rgb代码>
前景
我们已经描述了代表SQL UDF的初始功能。我们正在考虑未来的扩展包括支持:
- SQL路径,所以您可以创建一个功能在数据库和图书馆订阅他们从另一个,就像你在您的文件系统。
- 重载的udf。
- udf与参数的默认值。
SQL udf是一个很大的进步在SQL的可用性和可用于许多不同的方式阐述了这个博客。我们鼓励你想更有创意的方式利用SQL udf是<一个href="//www.neidfyre.com/www/product/databricks-sql" rel="noopener noreferrer" target="_blank">砖的SQL一个>或使用<一个href="//www.neidfyre.com/www/product/photon" rel="noopener noreferrer" target="_blank">光子一个>数据工程工作。试<一个href="//www.neidfyre.com/www/wp-content/uploads/notebooks/sql-user-defined-functions.html" rel="noopener noreferrer" target="_blank">笔记本电脑在这里一个>和看到<一个href="//www.neidfyre.com/docs/spark/latest/spark-sql/language-manual/sql-ref-syntax-ddl-create-sql-function.html" rel="noopener noreferrer" target="_blank">文档一个>为更多的信息。