介紹SQL用戶定義函數
通過<一個data-external-link="true" href="//www.eheci.com/www/blog/author/serge-rielau" aria-label="Serge Rielau">嗶嘰Rielau一個>和<一個data-external-link="true" href="//www.eheci.com/www/blog/author/allison-wang" aria-label="Allison Wang">Allison王一個>
2021年10月20日
在Beplay体育安卓版本平台的博客一個>
2021年10月20日
一個用戶定義的函數(UDF)是一個對用戶擴展本機功能意味著Apache的火花™SQL。SQL數據磚支持外部用戶定義函數寫在Scala中,Java、Python和R 1.3.0以來編程語言版本。雖然外部udf是非常強大的,他們也有一些注意事項:
- 安全gydF4y2Ba。外部語言編寫的一個UDF可以執行危險甚至惡意代碼。這需要嚴格控製誰可以創建UDF。
- 性能gydF4y2Ba。udf的黑匣子<一個href="//www.eheci.com/www/glossary/catalyst-optimizer" rel="noopener noreferrer" target="_blank">催化劑優化器一個>。鑒於催化劑不知道一個UDF的內部運作,它不能做任何工作來提高性能的UDF的上下文中一個SQL查詢。
- SQL的可用性。gydF4y2Ba為SQL用戶可以麻煩在宿主語言編寫udf在火花然後注冊它們。同樣,有一組擴展許多用戶可能想讓SQL相當簡單,開發外部UDF是過火了。
應對上述局限性,我們很高興向大家介紹一種新形式的UDF: SQL UDF。<一個href="//www.eheci.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.eheci.com/www/resources/ebook/bring-data-warehousing-data-lakes?itm_data=sqluserdefinedfunctions-blog-whylakehouseisnextdw" target="_blank">為什麼Lakehouse的數據是你的下一個數據倉庫的電子書一個>發現磚的內部運作Lakehouse平台。Beplay体育安卓版本
使用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.eheci.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.eheci.com/www/product/databricks-sql" rel="noopener noreferrer" target="_blank">磚的SQL一個>或使用<一個href="//www.eheci.com/www/product/photon" rel="noopener noreferrer" target="_blank">光子一個>數據工程工作。試<一個href="//www.eheci.com/www/wp-content/uploads/notebooks/sql-user-defined-functions.html" rel="noopener noreferrer" target="_blank">筆記本電腦在這裏一個>和看到<一個href="//www.eheci.com/docs/spark/latest/spark-sql/language-manual/sql-ref-syntax-ddl-create-sql-function.html" rel="noopener noreferrer" target="_blank">文檔一個>為更多的信息。