| <!doctype html><html lang=zh-Hans-CN dir=ltr class="docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-query-data/udf/java-user-defined-function" data-has-hydrated=false><meta charset=UTF-8><meta name=generator content="Docusaurus v3.6.3"><title data-rh=true>Java UDF, UDAF, UDWF, UDTF - Apache Doris</title><meta data-rh=true name=viewport content="width=device-width,initial-scale=1.0"><meta data-rh=true name=twitter:card content=summary_large_image><meta data-rh=true property=og:url content=https://doris.apache.org/zh-CN/docs/dev/query-data/udf/java-user-defined-function/><meta data-rh=true property=og:locale content=zh_Hans-CN><meta data-rh=true property=og:locale:alternate content=en_US><meta data-rh=true name=docusaurus_locale content=zh-CN><meta data-rh=true name=docsearch:language content=zh-CN><meta data-rh=true name=docusaurus_version content=current><meta data-rh=true name=docusaurus_tag content=docs-default-current><meta data-rh=true name=docsearch:version content=current><meta data-rh=true name=docsearch:docusaurus_tag content=docs-default-current><meta data-rh=true property=og:title content="Java UDF, UDAF, UDWF, UDTF - Apache Doris"><meta data-rh=true name=description content="Java UDF 为用户提供使用 Java 编写 UDF 的接口,以方便用户使用 Java 语言进行自定义函数的执行。 Doris 支持使用 JAVA 编写 UDF、UDAF 和 UDTF。下文如无特殊说明,使用 UDF 统称所有用户自定义函数。"><meta data-rh=true property=og:description content="Java UDF 为用户提供使用 Java 编写 UDF 的接口,以方便用户使用 Java 语言进行自定义函数的执行。 Doris 支持使用 JAVA 编写 UDF、UDAF 和 UDTF。下文如无特殊说明,使用 UDF 统称所有用户自定义函数。"><link data-rh=true rel=icon href=/zh-CN/images/favicon.ico><link data-rh=true rel=canonical href=https://doris.apache.org/zh-CN/docs/dev/query-data/udf/java-user-defined-function/><link data-rh=true rel=alternate href=https://doris.apache.org/docs/dev/query-data/udf/java-user-defined-function/ hreflang=en-US><link data-rh=true rel=alternate href=https://doris.apache.org/zh-CN/docs/dev/query-data/udf/java-user-defined-function/ hreflang=zh-Hans-CN><link data-rh=true rel=alternate href=https://doris.apache.org/docs/dev/query-data/udf/java-user-defined-function/ hreflang=x-default><link rel=alternate type=application/rss+xml href=/zh-CN/blog/rss.xml title="Apache Doris RSS Feed"><link rel=alternate type=application/atom+xml href=/zh-CN/blog/atom.xml title="Apache Doris Atom Feed"><link rel=preconnect href=https://analytics.apache.org/><script>var _paq=window._paq=window._paq||[];_paq.push(["setRequestMethod","POST"]),_paq.push(["trackPageView"]),_paq.push(["enableLinkTracking"]),_paq.push(["enableHeartBeatTimer"]),function(){var e="https://analytics.apache.org/";_paq.push(["setRequestMethod","POST"]),_paq.push(["setTrackerUrl",e+"matomo.php"]),_paq.push(["setSiteId","43"]);var a=document,t=a.createElement("script"),p=a.getElementsByTagName("script")[0];t.type="text/javascript",t.async=!0,t.src=e+"matomo.js",p.parentNode.insertBefore(t,p)}()</script><link rel=stylesheet href=/css/katex.min.css><script src=/js/custom-script.js></script><script async src=https://widget.kapa.ai/kapa-widget.bundle.js data-website-id=a5fb90df-217a-4097-95c0-80490220314b data-modal-title="Apache Doris AI" data-project-name="Apache Doris Website" data-project-logo=https://cdn.selectdb.com/static/doris_1_3c42247c63.png data-modal-image=https://cdn.selectdb.com/static/doris_logo_only_9617fa366a.png data-project-color=#444FD9 data-modal-disclaimer="This is a custom LLM with access to all [Doris documentation](https://doris.apache.org/docs/4.x/gettingStarted/what-is-apache-doris)." data-consent-required data-consent-screen-disclaimer="By clicking &quot;I agree, let's chat&quot;, you consent to the use of the AI assistant in accordance with kapa.ai's [Privacy Policy](https://www.kapa.ai/content/privacy-policy). This service uses reCAPTCHA, which requires your consent to Google's [Privacy Policy](https://policies.google.com/privacy) and [Terms of Service](https://policies.google.com/terms). By proceeding, you explicitly agree to both kapa.ai's and Google's privacy policies." data-bot-protection-mechanism=hcaptcha></script><link rel=stylesheet href=/zh-CN/assets/css/styles.246aa40f.css><script src=/zh-CN/assets/js/runtime~main.1ee6c80e.js defer></script><script src=/zh-CN/assets/js/main.659743a1.js defer></script><body class=navigation-with-keyboard><script>!function(){var t,e=function(){try{return new URLSearchParams(window.location.search).get("docusaurus-theme")}catch(t){}}()||function(){try{return window.localStorage.getItem("theme")}catch(t){}}();t=null!==e?e:"light",document.documentElement.setAttribute("data-theme",t)}(),function(){try{for(var[t,e]of new URLSearchParams(window.location.search).entries())if(t.startsWith("docusaurus-data-")){var a=t.replace("docusaurus-data-","data-");document.documentElement.setAttribute(a,e)}}catch(t){}}(),document.documentElement.setAttribute("data-announcement-bar-initially-dismissed",function(){try{return"true"===localStorage.getItem("docusaurus.announcement.dismiss")}catch(t){}return!1}())</script><div id=__docusaurus><div role=region aria-label=跳到主要内容><a class=skipToContent_fXgn href=#__docusaurus_skipToContent_fallback>跳到主要内容</a></div><nav aria-label=主导航 class="navbar navbar--fixed-top"><div class=navbar__inner><div class=navbar__items><div class=navbar-left><div class="navbar-logo-wrapper flex items-center"><div class="cursor-pointer docs"><svg width=127 height=30 fill=none viewBox="0 0 127 30"><g clip-path=url(#a)><path fill=#15A9CA d="m13.606 4.594-3.274-3.273A4.5 4.5 0 0 0 7.153 0a4.18 4.18 0 0 0-2.92 1.176 4.285 4.285 0 0 0-.06 6.107l5.94 5.94a.68.68 0 0 0 .933 0l2.556-2.557c.16-.192 2.834-3.245.003-6.072"/><path fill=#52CAA3 d="M18.97 9.823c-.624-.604-1.27-1.227-1.855-1.901v-.024q-.031.093-.047.189a6.73 6.73 0 0 1-2.003 3.747c-3.446 3.422-6.93 6.919-10.302 10.302l-.455.45a4.37 4.37 0 0 0-1.336 2.416 4.67 4.67 0 0 0 1.2 3.669 3.92 3.92 0 0 0 3.084 1.325c1.345.02 2-.157 2.98-1.11 3.92-3.837 7.84-7.706 10.807-10.646 1.4-1.392 1.72-3.697.729-5.25a18 18 0 0 0-2.803-3.167"/><path fill=#5268AD d="M-.004 7.774v14.457a.803.803 0 0 0 1.372.569l7.276-7.276a.74.74 0 0 0 0-1.042L1.368 7.206a.78.78 0 0 0-.56-.235.81.81 0 0 0-.812.803"/><path fill=#1D2434 d="M31.748 21.14V8.876h3.638c3.986 0 6.468 2.352 6.468 6.127s-2.481 6.139-6.468 6.139zm1.96-1.755h1.76c2.693 0 4.43-1.717 4.43-4.371s-1.737-4.371-4.43-4.371h-1.76zM50.612 21.33a6.326 6.326 0 1 1 0-12.652 6.326 6.326 0 0 1 0 12.652m0-10.835a4.512 4.512 0 0 0 0 9.016 4.555 4.555 0 0 0 4.45-4.532 4.473 4.473 0 0 0-4.45-4.484M75.056 8.875H73.04v12.254h2.015zM82.474 21.33a9.55 9.55 0 0 1-3.76-.804v-1.803a9.2 9.2 0 0 0 3.76.87c1.568 0 2.615-.717 2.615-1.78 0-1.195-1.278-1.67-2.63-2.171-2.121-.784-3.744-1.54-3.744-3.548 0-2.52 2.281-3.418 4.237-3.418 1.1 0 2.19.205 3.215.603v1.765a9.2 9.2 0 0 0-3.266-.651c-1.505 0-2.18.784-2.18 1.568 0 1.039 1.13 1.454 2.455 1.932 2.313.835 4.077 1.65 4.077 3.842-.008 2.125-1.968 3.595-4.779 3.595M66.026 16.174l.764-.33a3.63 3.63 0 0 0 2.2-3.327c0-2.211-1.592-3.638-4.054-3.638h-4.645V21.14h1.96V10.61h2.477a2.147 2.147 0 0 1 2.278 2.16 2.17 2.17 0 0 1-2.278 2.16h-1.042c-.459.067-.22.46-.22.46l3.956 5.75h2.214z"/></g><path fill=#484E5B d="M121.317 7.667h1.509v4.757h3.217v9.163h-1.463v-.747h-6.739v-1.403h6.739v-2.18h-6.175v-1.372h6.175v-2.043h-6.434v-1.418h3.171zm-3.781 8.477a34 34 0 0 0-.899-.808l-.336-.305v6.525h-1.418v-6.28q-.685 1.63-1.524 2.85l-.397-2.104q.489-.7.991-1.86.519-1.173.9-2.393h-1.647v-1.434h1.677V7.698h1.418v2.637h1.586v1.434h-1.586v1.433a69 69 0 0 1 2.089 1.707zm2.119-4.269a92 92 0 0 0-1.844-2.896l1.143-.824q.397.564.991 1.464t.93 1.463zm6.724-2.927a5 5 0 0 1-.198.32q-1.145 1.936-1.662 2.684l-1.235-.778q.442-.61.976-1.479.548-.87.899-1.494zM109.959 21.51a29 29 0 0 1-3.384-1.463 15.4 15.4 0 0 1-2.592-1.677 16.3 16.3 0 0 1-2.561 1.693 31 31 0 0 1-3.4 1.555l-.778-1.586a29 29 0 0 0 3.187-1.311q1.371-.67 2.378-1.448a12 12 0 0 1-1.845-2.607q-.762-1.464-1.296-3.37h-2.302V9.833h6.098a61 61 0 0 0-.686-2.028l1.662-.305q.213.488.61 1.677l.229.656h5.32v1.463h-2.378q-.488 1.905-1.235 3.37a11 11 0 0 1-1.829 2.607q2.043 1.539 5.595 2.622zm-8.644-10.214a13.3 13.3 0 0 0 1.052 2.76 9.5 9.5 0 0 0 1.601 2.18 8.8 8.8 0 0 0 1.539-2.165q.61-1.205 1.022-2.775z"/><defs><clipPath id=a><path fill=#fff d="M0 0h87.244v30H0z"/></clipPath></defs></svg></div></div><div class=undefined><div class="docs-search navbarSearchContainer_dCNk"><div class="navbar__search searchBarContainer_PzyC" dir=ltr><input placeholder=搜索 aria-label=Search class=navbar__search-input value=""><div class="loadingRing__K5d searchBarLoadingRing_e2f0"><div></div><div></div><div></div><div></div></div></div></div></div></div></div><div class="navbar__items navbar__items--right"><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a href=# aria-haspopup=true aria-expanded=false role=button class=navbar__link><svg class=icon-language width=16 height=16 viewBox="0 0 16 16" fill=none><path d="M7.75756 14.3L10.5816 6.91667H11.8759L14.7 14.3H13.4057L12.7501 12.4167H9.74113L9.06873 14.3H7.75756ZM10.1109 11.35H12.3467L11.254 8.3H11.2036L10.1109 11.35ZM2.84908 12.45L1.97498 11.5833L5.11841 8.48333C4.72618 8.05 4.38439 7.60267 4.09302 7.14133C3.80165 6.68044 3.54389 6.19444 3.31976 5.68333H4.61412C4.80463 6.06111 5.00635 6.39711 5.21927 6.69133C5.43219 6.986 5.68434 7.29444 5.97571 7.61667C6.43519 7.12778 6.81621 6.62511 7.11879 6.10867C7.42137 5.59178 7.67352 5.03889 7.87523 4.45H1V3.23333H5.33694V2H6.58087V3.23333H10.9178V4.45H9.11916C8.89503 5.18333 8.59805 5.89155 8.22824 6.57467C7.85842 7.25822 7.39895 7.90555 6.84983 8.51667L8.3459 10.0167L7.87523 11.2833L5.95891 9.38333L2.84908 12.45Z" fill=#4C576C /></svg></a><ul class=dropdown__menu><li><a href=/docs/dev/query-data/udf/java-user-defined-function/ rel="noopener noreferrer" class=dropdown__link lang=en-US>English</a><li><a href=/zh-CN/docs/dev/query-data/udf/java-user-defined-function/ rel="noopener noreferrer" class="dropdown__link dropdown__link--active" lang=zh-Hans-CN>中文</a></ul></div><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a aria-current=page class="navbar__link active" aria-haspopup=true aria-expanded=false role=button href=/zh-CN/docs/dev/query-data/udf/java-user-defined-function/><span class=text-sm>Versions: <!-- -->dev</span></a><ul class=dropdown__menu><li><a class=dropdown__link href=/zh-CN/docs/4.x/query-data/udf/java-user-defined-function/>4.x</a><li><a class=dropdown__link href=/zh-CN/docs/3.x/query-data/udf/java-user-defined-function/>3.x</a><li><a class=dropdown__link href=/zh-CN/docs/2.1/query-data/udf/java-user-defined-function/>2.1</a><li><a aria-current=page class="dropdown__link dropdown__link--active" href=/zh-CN/docs/dev/query-data/udf/java-user-defined-function/>dev</a><li><a class=dropdown__link href=/zh-CN/archive-docs/>归档文档</a></ul></div><button aria-label=切换导航栏 aria-expanded=false class="navbar__toggle clean-btn" type=button><svg width=30 height=30 viewBox="0 0 30 30" aria-hidden=true><path stroke=currentColor stroke-linecap=round stroke-miterlimit=10 stroke-width=2 d="M4 7h22M4 15h22M4 23h22"/></svg></button><a class="header-right-button-primary navbar-download-desktop" href=/zh-CN/download/>Download</a></div></div><div class=navbar__bottom><div class=docs-nav-version-locale><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a href=# aria-haspopup=true aria-expanded=false role=button class=navbar__link type=localeDropdown><svg class=icon-language width=16 height=16 viewBox="0 0 16 16" fill=none><path d="M7.75756 14.3L10.5816 6.91667H11.8759L14.7 14.3H13.4057L12.7501 12.4167H9.74113L9.06873 14.3H7.75756ZM10.1109 11.35H12.3467L11.254 8.3H11.2036L10.1109 11.35ZM2.84908 12.45L1.97498 11.5833L5.11841 8.48333C4.72618 8.05 4.38439 7.60267 4.09302 7.14133C3.80165 6.68044 3.54389 6.19444 3.31976 5.68333H4.61412C4.80463 6.06111 5.00635 6.39711 5.21927 6.69133C5.43219 6.986 5.68434 7.29444 5.97571 7.61667C6.43519 7.12778 6.81621 6.62511 7.11879 6.10867C7.42137 5.59178 7.67352 5.03889 7.87523 4.45H1V3.23333H5.33694V2H6.58087V3.23333H10.9178V4.45H9.11916C8.89503 5.18333 8.59805 5.89155 8.22824 6.57467C7.85842 7.25822 7.39895 7.90555 6.84983 8.51667L8.3459 10.0167L7.87523 11.2833L5.95891 9.38333L2.84908 12.45Z" fill=#4C576C /></svg></a><ul class=dropdown__menu><li><a href=/docs/dev/query-data/udf/java-user-defined-function/ rel="noopener noreferrer" class=dropdown__link lang=en-US>English</a><li><a href=/zh-CN/docs/dev/query-data/udf/java-user-defined-function/ rel="noopener noreferrer" class="dropdown__link dropdown__link--active" lang=zh-Hans-CN>中文</a></ul></div><div class="navbar__item dropdown dropdown--hoverable dropdown--right"><a aria-current=page class="navbar__link active" aria-haspopup=true aria-expanded=false role=button type=docsVersionDropdown href=/zh-CN/docs/dev/query-data/udf/java-user-defined-function/><span class=text-sm>Versions: <!-- -->dev</span></a><ul class=dropdown__menu><li><a class=dropdown__link href=/zh-CN/docs/4.x/query-data/udf/java-user-defined-function/>4.x</a><li><a class=dropdown__link href=/zh-CN/docs/3.x/query-data/udf/java-user-defined-function/>3.x</a><li><a class=dropdown__link href=/zh-CN/docs/2.1/query-data/udf/java-user-defined-function/>2.1</a><li><a aria-current=page class="dropdown__link dropdown__link--active" href=/zh-CN/docs/dev/query-data/udf/java-user-defined-function/>dev</a><li><a class=dropdown__link href=/zh-CN/archive-docs/>归档文档</a></ul></div></div></div><div role=presentation class=navbar-sidebar__backdrop></div></nav><div id=__docusaurus_skipToContent_fallback class="main-wrapper mainWrapper_eExm"><div class=docsWrapper_hBAB><button aria-label=回到顶部 class="clean-btn theme-back-to-top-button backToTopButton_sjWU" type=button></button><div class=docRoot_UBD9><aside class="theme-doc-sidebar-container docSidebarContainer_YfHR"><div class=sidebarViewport_aRkj><div class=sidebar_mhZE><nav aria-label=文档侧边栏 class="menu thin-scrollbar menu_Y1UP menuWithAnnouncementBar_fPny"><ul class="theme-doc-sidebar-menu menu__list"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=true href=/zh-CN/docs/dev/gettingStarted/what-is-apache-doris/>快速开始</a></div><ul style=display:block;overflow:visible;height:auto class="menu__list menu__list_level_2 community_level_2"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link length=3 tabindex=0 href=/zh-CN/docs/dev/gettingStarted/what-is-apache-doris/>Apache Doris 简介</a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link length=3 tabindex=0 href=/zh-CN/docs/dev/gettingStarted/quick-start/>快速体验 Apache Doris</a><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/gettingStarted/alternatives/alternative-to-clickhouse/>技术对比</a></div></ul><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" role=button aria-expanded=true href=/zh-CN/docs/dev/install/preparation/env-checking/>使用指南</a></div><ul style=display:block;overflow:visible;height:auto class="menu__list menu__list_level_2 community_level_2"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/install/preparation/env-checking/>安装部署</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/db-connect/database-connect/>数据库连接</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/table-design/overview/>数据表设计</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/data-operate/import/load-manual/>数据导入</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/data-operate/update/update-overview/>数据更新与删除</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/data-operate/export/export-overview/>数据导出</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" role=button aria-expanded=true tabindex=0 href=/zh-CN/docs/dev/query-data/mysql-compatibility/>数据查询</a></div><ul style=display:block;overflow:visible;height:auto class=menu__list><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link length=9 tabindex=0 href=/zh-CN/docs/dev/query-data/mysql-compatibility/>MySQL 兼容性</a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link length=9 tabindex=0 href=/zh-CN/docs/dev/query-data/join/>连接(JOIN)</a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link length=9 tabindex=0 href=/zh-CN/docs/dev/query-data/subquery/>子查询</a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link length=9 tabindex=0 href=/zh-CN/docs/dev/query-data/multi-dimensional-analytics/>聚合多维分析</a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link length=9 tabindex=0 href=/zh-CN/docs/dev/query-data/window-function/>分析函数(窗口函数)</a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link length=9 tabindex=0 href=/zh-CN/docs/dev/query-data/cte/>公用表表达式(CTE)</a><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-3 menu__list-item"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret menu__link--active" role=button aria-expanded=true tabindex=0 href=/zh-CN/docs/dev/query-data/udf/alias-function/>自定义函数</a></div><ul style=display:block;overflow:visible;height:auto class=menu__list><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-4 menu__list-item"><a class=menu__link length=2 tabindex=0 href=/zh-CN/docs/dev/query-data/udf/alias-function/>别名函数</a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-4 menu__list-item"><a class="menu__link menu__link--active" aria-current=page length=2 tabindex=0 href=/zh-CN/docs/dev/query-data/udf/java-user-defined-function/>Java UDF, UDAF, UDWF, UDTF</a></ul><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link length=9 tabindex=0 href=/zh-CN/docs/dev/query-data/complex-type/>复杂类型查询</a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-3 menu__list-item"><a class=menu__link length=9 tabindex=0 href=/zh-CN/docs/dev/query-data/lateral-view/>列转行 (Lateral View)</a></ul><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/query-acceleration/performance-tuning-overview/tuning-overview/>查询加速</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/ai/ai-overview/>AI</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/lakehouse/lakehouse-overview/>湖仓一体</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/observability/overview/>可观测性</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/compute-storage-decoupled/overview/>存算分离</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/admin-manual/auth/security-overview/>安全合规</a></div></ul><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=true href=/zh-CN/docs/dev/benchmark/ssb/>性能测试</a></div><ul style=display:block;overflow:visible;height:auto class="menu__list menu__list_level_2 community_level_2"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link length=3 tabindex=0 href=/zh-CN/docs/dev/benchmark/ssb/>Star Schema Benchmark</a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link length=3 tabindex=0 href=/zh-CN/docs/dev/benchmark/tpch/>TPC-H Benchmark</a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link length=3 tabindex=0 href=/zh-CN/docs/dev/benchmark/tpcds/>TPC-DS Benchmark</a></ul><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=true href=/zh-CN/docs/dev/admin-manual/cluster-management/upgrade/>管理指南</a></div><ul style=display:block;overflow:visible;height:auto class="menu__list menu__list_level_2 community_level_2"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/admin-manual/cluster-management/upgrade/>集群管理</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/admin-manual/workload-management/workload-management-summary/>负载管理</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/admin-manual/data-admin/overview/>容灾管理</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/admin-manual/log-management/fe-log/>日志管理</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/admin-manual/maint-monitor/metrics/>运维监控</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/admin-manual/config/config-dir/>配置管理</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/admin-manual/system-tables/overview/>系统表</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/admin-manual/trouble-shooting/memory-management/overview/>故障诊断处理</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/admin-manual/open-api/overview/>OPEN API</a></div></ul><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=true href=/zh-CN/docs/dev/ecosystem/spark-doris-connector/>生态扩展</a></div><ul style=display:block;overflow:visible;height:auto class="menu__list menu__list_level_2 community_level_2"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link length=9 tabindex=0 href=/zh-CN/docs/dev/ecosystem/spark-doris-connector/>Spark Doris Connector</a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link length=9 tabindex=0 href=/zh-CN/docs/dev/ecosystem/flink-doris-connector/>Flink Doris Connector</a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link length=9 tabindex=0 href=/zh-CN/docs/dev/ecosystem/doris-kafka-connector/>Doris Kafka Connector</a><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/ecosystem/doris-operator/doris-operator-overview/>Doris Operator</a></div><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link length=9 tabindex=0 href=/zh-CN/docs/dev/ecosystem/doris-streamloader/>Doris Streamloader</a><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/ecosystem/bi/apache-superset/>BI</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/ecosystem/bi/clouddm/>SQL Clients</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/ecosystem/observability/logstash/>可观测性</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/ecosystem/cloudcanal/>More</a></div></ul><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=true href=/zh-CN/docs/dev/faq/install-faq/>常见问题</a></div><ul style=display:block;overflow:visible;height:auto class="menu__list menu__list_level_2 community_level_2"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link length=7 tabindex=0 href=/zh-CN/docs/dev/faq/install-faq/>常见运维问题</a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link length=7 tabindex=0 href=/zh-CN/docs/dev/faq/data-faq/>数据操作问题</a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link length=7 tabindex=0 href=/zh-CN/docs/dev/faq/sql-faq/>常见查询问题</a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link length=7 tabindex=0 href=/zh-CN/docs/dev/faq/lakehouse-faq/>常见数据湖问题</a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link length=7 tabindex=0 href=/zh-CN/docs/dev/faq/bi-faq/>常见 BI 问题</a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link length=7 tabindex=0 href=/zh-CN/docs/dev/faq/correctness-faq/>数据正确性问题</a><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link length=7 tabindex=0 href=/zh-CN/docs/dev/faq/load-faq/>常见导入问题</a></ul><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=true href=/zh-CN/docs/dev/sql-manual/basic-element/sql-data-types/data-type-overview/>SQL 手册</a></div><ul style=display:block;overflow:visible;height:auto class="menu__list menu__list_level_2 community_level_2"><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/sql-manual/basic-element/sql-data-types/data-type-overview/>基础元素</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/sql-manual/sql-functions/ai-functions/distance-functions/cosine-distance/>SQL 函数</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/sql-manual/sql-statements/data-query/SELECT/>SQL 语句</a></div></ul><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-1 menu__list-item"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=true href=/zh-CN/docs/dev/releasenotes/all-release/>版本发布</a></div><ul style=display:block;overflow:visible;height:auto class="menu__list menu__list_level_2 community_level_2"><li class="theme-doc-sidebar-item-link theme-doc-sidebar-item-link-level-2 menu__list-item"><a class=menu__link length=8 tabindex=0 href=/zh-CN/docs/dev/releasenotes/all-release/>最新发布</a><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/releasenotes/v4.0/release-4.0.2/>v4.0</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/releasenotes/v3.1/release-3.1.4/>v3.1</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/releasenotes/v3.0/release-3.0.8/>v3.0</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/releasenotes/v2.1/release-2.1.11/>v2.1</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/releasenotes/v2.0/release-2.0.15/>v2.0</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/releasenotes/v1.2/release-1.2.8/>v1.2</a></div><li class="theme-doc-sidebar-item-category theme-doc-sidebar-item-category-level-2 menu__list-item menu__list-item--collapsed"><div class=menu__list-item-collapsible><a class="menu__link menu__link--sublist menu__link--sublist-caret" role=button aria-expanded=false tabindex=0 href=/zh-CN/docs/dev/releasenotes/v1.1/release-1.1.5/>v1.1</a></div></ul></ul></nav></div></div></aside><main class=docMainContainer_TBSr><div class="container padding-top--md padding-bottom--lg"><div class=row><div class="col docItemCol_z5aJ"><div class="theme-doc-version-banner alert alert--warning margin-bottom--md" role=alert><div>此处为 Apache Doris <b>尚未发布</b>的版本文档,不建议作为使用参考。</div><div class=margin-top--md>使用参考请跳转至 <b><a href=/zh-CN/docs/4.x/query-data/udf/java-user-defined-function/>2.1</a></b> 或 <b><a href=/zh-CN/docs/3.x/gettingStarted/what-is-apache-doris/>3.x</a></b> 正式版本文档进行查阅。</div></div><div class=docItemContainer_c0TR><article><nav class="theme-doc-breadcrumbs breadcrumbsContainer_Z_bl" aria-label=页面路径><ul class=breadcrumbs itemscope itemtype=https://schema.org/BreadcrumbList><li class=breadcrumbs__item><a aria-label=主页面 class=breadcrumbs__link href=/zh-CN/><svg viewBox="0 0 24 24" class=breadcrumbHomeIcon_YNFT><path d="M10 19v-5h4v5c0 .55.45 1 1 1h3c.55 0 1-.45 1-1v-7h1.7c.46 0 .68-.57.33-.87L12.67 3.6c-.38-.34-.96-.34-1.34 0l-8.36 7.53c-.34.3-.13.87.33.87H5v7c0 .55.45 1 1 1h3c.55 0 1-.45 1-1z" fill=currentColor /></svg></a><li class=breadcrumbs__item><span class=breadcrumbs__link>使用指南</span><meta itemprop=position content=1><li class=breadcrumbs__item><span class=breadcrumbs__link>数据查询</span><meta itemprop=position content=2><li class=breadcrumbs__item><span class=breadcrumbs__link>自定义函数</span><meta itemprop=position content=3><li itemscope itemprop=itemListElement itemtype=https://schema.org/ListItem class="breadcrumbs__item breadcrumbs__item--active"><span class=breadcrumbs__link itemprop=name>Java UDF, UDAF, UDWF, UDTF</span><meta itemprop=position content=4></ul></nav><div class="tocCollapsible_ETCw theme-doc-toc-mobile tocMobile_bxCs"><button type=button class="clean-btn tocCollapsibleButton_TO0P">本页总览</button></div><div class="theme-doc-markdown markdown"><header><h1>Java UDF, UDAF, UDWF, UDTF</h1></header><h2 class="anchor anchorWithStickyNavbar_LWe7" id=概述>概述<a href=#概述 class=hash-link aria-label=概述的直接链接 title=概述的直接链接></a></h2> |
| <p>Java UDF 为用户提供使用 Java 编写 UDF 的接口,以方便用户使用 Java 语言进行自定义函数的执行。 |
| Doris 支持使用 JAVA 编写 UDF、UDAF 和 UDTF。下文如无特殊说明,使用 UDF 统称所有用户自定义函数。</p> |
| <ol> |
| <li>Java UDF 是较为常见的自定义标量函数 (Scalar Function),即每输入一行数据,就会有一行对应的结果输出,较为常见的有 ABS,LENGTH 等。值得一提的是对于用户来讲,Hive UDF 是可以直接迁移至 Doris 的。</li> |
| <li>Java UDAF 即为自定义的聚合函数 (Aggregate Function),即在输入多行数据进行聚合后,仅输出一行对应的结果,较为常见的有 MIN,MAX,COUNT 等。</li> |
| <li>Java UDWF 即为自定义的窗口函数 (Window Function),它为每行返回的结果是在一个窗口内(一行或多行)计算的值,较为常见的有 ROW_NUMBER,RANK,DENSE_RANK 等。</li> |
| <li>JAVA UDTF 即为自定义的表函数 (Table Function),即每输一行数据,可以产生一行或多行的结果,在 Doris 中需要结合 Lateral View 使用可以达到行转列的效果,较为常见的有 EXPLODE,EXPLODE_SPLIT 等。<strong>该功能自 Doris 3.0 版本起开始支持。</strong></li> |
| </ol> |
| <h2 class="anchor anchorWithStickyNavbar_LWe7" id=类型对应关系>类型对应关系<a href=#类型对应关系 class=hash-link aria-label=类型对应关系的直接链接 title=类型对应关系的直接链接></a></h2> |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| <table><thead><tr><th>Doris 数据类型<th>Java UDF 参数类型<tbody><tr><td>Bool<td>Boolean<tr><td>TinyInt<td>Byte<tr><td>SmallInt<td>Short<tr><td>Int<td>Integer<tr><td>BigInt<td>Long<tr><td>LargeInt<td>BigInteger<tr><td>Float<td>Float<tr><td>Double<td>Double<tr><td>Date<td>LocalDate<tr><td>Datetime<td>LocalDateTime<tr><td>IPV4/IPV6<td>InetAddress<tr><td>String<td>String<tr><td>Decimal<td>BigDecimal<tr><td><code>array<Type></code><td><code>ArrayList<Type></code> <code>List<Type></code> (支持嵌套)<tr><td><code>map<Type1,Type2></code><td><code>HashMap<Type1,Type2></code> <code>Map<Type1,Type2></code> (支持嵌套)<tr><td><code>struct<Type...></code><td><code>ArrayList<Object></code>(从 3.0.0 版本开始支持)<code>List<Type></code><tr><td>VarBinary<td>byte[], Byte[](从 4.0 版本开始支持Varbinary类型, 优先建议使用byte[] 类型数据会少一层额外转换)</table> |
| <div class="theme-admonition theme-admonition-tip admonition_Gfwi alert alert--success"><div class=admonitionHeading_f1Ed>提示</div><div class=admonitionContent_UjKb><p><code>array</code>、<code>map</code>、<code>struct</code> 类型可以嵌套其它类型。例如,Doris 中的 <code>array<array<int>></code> 对应 Java UDF 参数类型为 <code>ArrayList<ArrayList<Integer>></code>,其他类型依此类推。 |
| <code>List<Type></code> 和 <code>Map<Type1,Type2></code> 类的支持从3.1.0 版本开始</div></div> |
| <div class="theme-admonition theme-admonition-caution admonition_Gfwi alert alert--warning"><div class=admonitionHeading_f1Ed>注意</div><div class=admonitionContent_UjKb><p>在创建函数时,请务必使用 <code>string</code> 类型而不是 <code>varchar</code>,否则可能会导致函数执行失败。</div></div> |
| <h2 class="anchor anchorWithStickyNavbar_LWe7" id=使用限制>使用限制<a href=#使用限制 class=hash-link aria-label=使用限制的直接链接 title=使用限制的直接链接></a></h2> |
| <ol> |
| <li> |
| <p>不支持复杂数据类型(HLL,Bitmap)。</p> |
| </li> |
| <li> |
| <p>当前允许用户自己指定 JVM 最大堆大小,配置项是 be.conf 中的 <code>JAVA_OPTS</code> 的 -Xmx 部分。默认 1024m,如果需要聚合数据,建议调大一些,增加性能,减少内存溢出风险。</p> |
| </li> |
| <li> |
| <p>由于 jvm 加载同名类的问题,不要同时使用多个同名类作为 udf 实现,如果想更新某个同名类的 udf,需要重启 be 重新加载 classpath。</p> |
| </li> |
| <li> |
| <p>同名函数</p> |
| <p>用户可以创建和内置函数签名完全相同的自定义函数。默认情况下,系统会优先匹配内置函数。但如果使用函数时,指定了 <code>database</code>(即 <code>db.function()</code>),则会被强制认为是用户自定义函数。</p> |
| <p>在 3.0.7 版本中,新增了会话变量 <code>prefer_udf_over_builtin</code>。当设置为 <code>true</code> 时,会优先匹配用户自定义函数,以便于用户从其他系统迁移到 Doris 时,在不改变函数名称的情况下,通过自定义函数保持原有系统的函数行为。</p> |
| </li> |
| </ol> |
| <h2 class="anchor anchorWithStickyNavbar_LWe7" id=快速上手>快速上手<a href=#快速上手 class=hash-link aria-label=快速上手的直接链接 title=快速上手的直接链接></a></h2> |
| <p>本节主要介绍如何开发 Java UDF。在 <code>samples/doris-demo/java-udf-demo/</code> 目录下提供了示例代码,供您参考。您也可以查看 <a href=https://github.com/apache/doris/tree/master/samples/doris-demo/java-udf-demo target=_blank rel="noopener noreferrer">demo</a>。</p> |
| <p>UDF 的使用与普通的函数方式一致,唯一的区别在于,内置函数的作用域是全局的,而 UDF 的作用域是 DB 内部。 |
| 所以如果当前链接 session 位于数据库 DB 内部时,直接使用 UDF 名字会在当前 DB 内部查找对应的 UDF。否则用户需要显示的指定 UDF 的数据库名字,例如 <code>dbName.funcName</code>。</p> |
| <p>接下来的章节介绍实例,均会在<code>test_table</code> 上做测试,对应建表如下:</p> |
| <div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_biex><pre tabindex=0 class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><span class=token-line style=color:#F8F8F2><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">CREATE</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">TABLE</span><span class="token plain"> </span><span class="token identifier punctuation" style="color:rgb(248, 248, 242)">`</span><span class="token identifier">test_table</span><span class="token identifier punctuation" style="color:rgb(248, 248, 242)">`</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> id </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> </span><span class="token boolean">NULL</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> d1 </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">double</span><span class="token plain"> </span><span class="token boolean">NULL</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> str string </span><span class="token boolean">NULL</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">ENGINE</span><span class="token operator">=</span><span class="token plain">OLAP</span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">DUPLICATE</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">KEY</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token identifier punctuation" style="color:rgb(248, 248, 242)">`</span><span class="token identifier">id</span><span class="token identifier punctuation" style="color:rgb(248, 248, 242)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">DISTRIBUTED</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">BY</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">HASH</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token identifier punctuation" style="color:rgb(248, 248, 242)">`</span><span class="token identifier">id</span><span class="token identifier punctuation" style="color:rgb(248, 248, 242)">`</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> BUCKETS </span><span class="token number">1</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain">PROPERTIES </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token string" style="color:rgb(255, 121, 198)">"replication_num"</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"1"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">insert</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">into</span><span class="token plain"> test_table </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">values</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">111.11</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"a,b,c"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">insert</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">into</span><span class="token plain"> test_table </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">values</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">6</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token number">666.66</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"d,e"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre><div class=buttonGroup__atx><button type=button aria-label=复制代码到剪贴板 title=复制 class=clean-btn><span class=copyButtonIcons_eSgA aria-hidden=true><svg viewBox="0 0 24 24" class=copyButtonIcon_y97N><path fill=currentColor d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"/></svg><svg viewBox="0 0 24 24" class=copyButtonSuccessIcon_LjdS><path fill=currentColor d=M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z /></svg></span></button></div></div></div> |
| <h3 class="anchor anchorWithStickyNavbar_LWe7" id=java-udf-实例介绍>Java-UDF 实例介绍<a href=#java-udf-实例介绍 class=hash-link aria-label="Java-UDF 实例介绍的直接链接" title="Java-UDF 实例介绍的直接链接"></a></h3> |
| <p>使用 Java 代码编写 UDF,UDF 的主入口必须为 <code>evaluate</code> 函数。这一点与 Hive 等其他引擎保持一致。在本示例中,我们编写了 <code>AddOne</code> UDF 来完成对整型输入进行加一的操作。</p> |
| <ol> |
| <li> |
| <p>首先编写对应的 Java 代码,打包生成 JAR 包。</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_biex><pre tabindex=0 class="prism-code language-java codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><span class=token-line style=color:#F8F8F2><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">AddOne</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">extends</span><span class="token plain"> </span><span class="token class-name">UDF</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token class-name">Integer</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">evaluate</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name">Integer</span><span class="token plain"> value</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> value </span><span class="token operator">==</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token plain"> </span><span class="token operator">?</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token plain"> </span><span class="token operator">:</span><span class="token plain"> value </span><span class="token operator">+</span><span class="token plain"> </span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre><div class=buttonGroup__atx><button type=button aria-label=复制代码到剪贴板 title=复制 class=clean-btn><span class=copyButtonIcons_eSgA aria-hidden=true><svg viewBox="0 0 24 24" class=copyButtonIcon_y97N><path fill=currentColor d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"/></svg><svg viewBox="0 0 24 24" class=copyButtonSuccessIcon_LjdS><path fill=currentColor d=M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z /></svg></span></button></div></div></div> |
| </li> |
| <li> |
| <p>在 Doris 中注册创建 Java-UDF 函数。更多语法帮助可参阅 <a href=/zh-CN/docs/dev/query-data/sql-manual/sql-statements/function/CREATE-FUNCTION/>CREATE FUNCTION</a>.</p> |
| <div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_biex><pre tabindex=0 class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><span class=token-line style=color:#F8F8F2><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">CREATE</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">FUNCTION</span><span class="token plain"> java_udf_add_one</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">RETURNS</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> PROPERTIES </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"file"</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"file:///path/to/java-udf-demo-jar-with-dependencies.jar"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"symbol"</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"org.apache.doris.udf.AddOne"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"always_nullable"</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"true"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"type"</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"JAVA_UDF"</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre><div class=buttonGroup__atx><button type=button aria-label=复制代码到剪贴板 title=复制 class=clean-btn><span class=copyButtonIcons_eSgA aria-hidden=true><svg viewBox="0 0 24 24" class=copyButtonIcon_y97N><path fill=currentColor d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"/></svg><svg viewBox="0 0 24 24" class=copyButtonSuccessIcon_LjdS><path fill=currentColor d=M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z /></svg></span></button></div></div></div> |
| </li> |
| <li> |
| <p>用户使用 UDF 必须拥有对应数据库的 <code>SELECT</code> 权限。 |
| 如果想查看注册成功的对应 UDF 函数,可以使用<a href=/zh-CN/docs/dev/query-data/sql-manual/sql-statements/function/SHOW-FUNCTIONS/>SHOW FUNCTIONS</a> 命令。</p> |
| <div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_biex><pre tabindex=0 class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><span class=token-line style=color:#F8F8F2><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">select</span><span class="token plain"> id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">java_udf_add_one</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> test_table</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">+</span><span class="token comment" style="color:rgb(98, 114, 164)">------+----------------------+</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">|</span><span class="token plain"> id </span><span class="token operator">|</span><span class="token plain"> java_udf_add_one</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">+</span><span class="token comment" style="color:rgb(98, 114, 164)">------+----------------------+</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">|</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token number">2</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">|</span><span class="token plain"> </span><span class="token number">6</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token number">7</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">+</span><span class="token comment" style="color:rgb(98, 114, 164)">------+----------------------+</span><br></span></code></pre><div class=buttonGroup__atx><button type=button aria-label=复制代码到剪贴板 title=复制 class=clean-btn><span class=copyButtonIcons_eSgA aria-hidden=true><svg viewBox="0 0 24 24" class=copyButtonIcon_y97N><path fill=currentColor d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"/></svg><svg viewBox="0 0 24 24" class=copyButtonSuccessIcon_LjdS><path fill=currentColor d=M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z /></svg></span></button></div></div></div> |
| </li> |
| <li> |
| <p>当不再需要 UDF 函数时,可以通过下述命令来删除一个 UDF 函数,可以参考 <a href=/zh-CN/docs/dev/query-data/sql-manual/sql-statements/function/DROP-FUNCTION/>DROP FUNCTION</a></p> |
| </li> |
| </ol> |
| <p>另外,如果定义的 UDF 中需要加载很大的资源文件,或者希望可以定义全局的 static 变量,可以参照文档下方的 static 变量加载方式。</p> |
| <h3 class="anchor anchorWithStickyNavbar_LWe7" id=java-udaf-实例介绍>Java-UDAF 实例介绍<a href=#java-udaf-实例介绍 class=hash-link aria-label="Java-UDAF 实例介绍的直接链接" title="Java-UDAF 实例介绍的直接链接"></a></h3> |
| <p>在使用 Java 代码编写 UDAF 时,有一些必须实现的函数 (标记 required) 和一个内部类 State,下面将以具体的实例来说明。</p> |
| <ol> |
| <li>首先编写对应的 Java UDAF 代码,打包生成 JAR 包。</li> |
| </ol> |
| <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed=true><summary> 示例 1: SimpleDemo 将实现一个类似的 sum 的简单函数,输入参数 INT,输出参数是 INT</summary><div><div class=collapsibleContent_i85q> |
| <!-- --> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_biex><pre tabindex=0 class="prism-code language-java codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><span class=token-line style=color:#F8F8F2><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">package</span><span class="token plain"> </span><span class="token namespace">org</span><span class="token namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token namespace">apache</span><span class="token namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token namespace">doris</span><span class="token namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token namespace">udf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token import namespace">java</span><span class="token import namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token import namespace">io</span><span class="token import namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token import class-name">DataInputStream</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token import namespace">java</span><span class="token import namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token import namespace">io</span><span class="token import namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token import class-name">DataOutputStream</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token import namespace">java</span><span class="token import namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token import namespace">io</span><span class="token import namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token import class-name">IOException</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token import namespace">java</span><span class="token import namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token import namespace">util</span><span class="token import namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token import namespace">logging</span><span class="token import namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token import class-name">Logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">SimpleDemo</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token class-name">Logger</span><span class="token plain"> log </span><span class="token operator">=</span><span class="token plain"> </span><span class="token class-name">Logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">getLogger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"SimpleDemo"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">//Need an inner class to store data</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">/*required*/</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">static</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">State</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/*some variables if you need */</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> sum </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">/*required*/</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token class-name">State</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">create</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* here could do some init work if needed */</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">State</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">/*required*/</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">destroy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name">State</span><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* here could do some destroy work if needed */</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">/*Not Required*/</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">reset</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name">State</span><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/*if you want this udaf function can work with window function.*/</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/*Must impl this, it will be reset to init state after calculate every window frame*/</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">sum </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">/*required*/</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">//first argument is State, then other types your input</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name">State</span><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token class-name">Integer</span><span class="token plain"> val</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">throws</span><span class="token plain"> </span><span class="token class-name">Exception</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* here doing update work when input data*/</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">val </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">sum </span><span class="token operator">+=</span><span class="token plain"> val</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">/*required*/</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">serialize</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name">State</span><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token class-name">DataOutputStream</span><span class="token plain"> out</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">throws</span><span class="token plain"> </span><span class="token class-name">IOException</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* serialize some data into buffer */</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> out</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">writeInt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">sum</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">/*required*/</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">deserialize</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name">State</span><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token class-name">DataInputStream</span><span class="token plain"> in</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">throws</span><span class="token plain"> </span><span class="token class-name">IOException</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* deserialize get data from buffer before you put */</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> val </span><span class="token operator">=</span><span class="token plain"> in</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">readInt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">sum </span><span class="token operator">=</span><span class="token plain"> val</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">/*required*/</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">merge</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name">State</span><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token class-name">State</span><span class="token plain"> rhs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">throws</span><span class="token plain"> </span><span class="token class-name">Exception</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* merge data from state */</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">sum </span><span class="token operator">+=</span><span class="token plain"> rhs</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">sum</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">/*required*/</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">//return Type you defined</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token class-name">Integer</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">getValue</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name">State</span><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">throws</span><span class="token plain"> </span><span class="token class-name">Exception</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">/* return finally result */</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">sum</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span></code></pre><div class=buttonGroup__atx><button type=button aria-label=复制代码到剪贴板 title=复制 class=clean-btn><span class=copyButtonIcons_eSgA aria-hidden=true><svg viewBox="0 0 24 24" class=copyButtonIcon_y97N><path fill=currentColor d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"/></svg><svg viewBox="0 0 24 24" class=copyButtonSuccessIcon_LjdS><path fill=currentColor d=M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z /></svg></span></button></div></div></div> |
| </div></div></details> |
| <details class="details_lb9f alert alert--info details_b_Ee" data-collapsed=true><summary> 示例 2: MedianUDAF 是一个计算中位数的功能,输入类型为 (DOUBLE, INT), 输出为 DOUBLE </summary><div><div class=collapsibleContent_i85q> |
| <!-- --> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_biex><pre tabindex=0 class="prism-code language-java codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><span class=token-line style=color:#F8F8F2><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">package</span><span class="token plain"> </span><span class="token namespace">org</span><span class="token namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token namespace">apache</span><span class="token namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token namespace">doris</span><span class="token namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token namespace">udf</span><span class="token namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token namespace">demo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token import namespace">java</span><span class="token import namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token import namespace">io</span><span class="token import namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token import class-name">DataInputStream</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token import namespace">java</span><span class="token import namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token import namespace">io</span><span class="token import namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token import class-name">DataOutputStream</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token import namespace">java</span><span class="token import namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token import namespace">math</span><span class="token import namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token import class-name">BigDecimal</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token import namespace">java</span><span class="token import namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token import namespace">util</span><span class="token import namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token import class-name">Arrays</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">import</span><span class="token plain"> </span><span class="token import namespace">java</span><span class="token import namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token import namespace">util</span><span class="token import namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token import namespace">logging</span><span class="token import namespace punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token import class-name">Logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">/*UDAF 计算中位数*/</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">MedianUDAF</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token class-name">Logger</span><span class="token plain"> log </span><span class="token operator">=</span><span class="token plain"> </span><span class="token class-name">Logger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">getLogger</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"MedianUDAF"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">//状态存储</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">static</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">State</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">//返回结果的精度</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> scale </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">//是否是某一个 tablet 下的某个聚合条件下的数据第一次执行 add 方法</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">boolean</span><span class="token plain"> isFirst </span><span class="token operator">=</span><span class="token plain"> </span><span class="token boolean">true</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">//数据存储</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token class-name">StringBuilder</span><span class="token plain"> stringBuilder</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">//状态初始化</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token class-name">State</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">create</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token class-name">State</span><span class="token plain"> state </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">State</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">//根据每个 tablet 下的聚合条件需要聚合的数据量大小,预先初始化,增加性能</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">stringBuilder </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">StringBuilder</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">1000</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">//处理执行单位处理各自 tablet 下的各自聚合条件下的每个数据</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">add</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name">State</span><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token class-name">Double</span><span class="token plain"> val</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> scale</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">throws</span><span class="token plain"> </span><span class="token class-name">IOException</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">val </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token plain"> </span><span class="token operator">&&</span><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">isFirst</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">stringBuilder</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">append</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">scale</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">append</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">","</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">append</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">val</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">append</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">","</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">isFirst </span><span class="token operator">=</span><span class="token plain"> </span><span class="token boolean">false</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">val </span><span class="token operator">!=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">stringBuilder</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">append</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">val</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">append</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">","</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">//处理数据完需要输出等待聚合</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">serialize</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name">State</span><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token class-name">DataOutputStream</span><span class="token plain"> out</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">throws</span><span class="token plain"> </span><span class="token class-name">IOException</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">//目前暂时只提供 DataOutputStream,如果需要序列化对象可以考虑拼接字符串,转换 json,序列化成字节数组等方式</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">//如果要序列化 State 对象,可能需要自己将 State 内部类实现序列化接口</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">//最终都是要通过 DataOutputStream 传输</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> out</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">writeUTF</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">stringBuilder</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">toString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">//获取处理数据执行单位输出的数据</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">deserialize</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name">State</span><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token class-name">DataInputStream</span><span class="token plain"> in</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">throws</span><span class="token plain"> </span><span class="token class-name">IOException</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> string </span><span class="token operator">=</span><span class="token plain"> in</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">readUTF</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">scale </span><span class="token operator">=</span><span class="token plain"> </span><span class="token class-name">Integer</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">parseInt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name">String</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">valueOf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">string</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">charAt</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token class-name">StringBuilder</span><span class="token plain"> stringBuilder </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">StringBuilder</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">string</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">substring</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">stringBuilder </span><span class="token operator">=</span><span class="token plain"> stringBuilder</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">//聚合执行单位按照聚合条件合并某一个键下数据的处理结果 ,每个键第一次合并时,state1 参数是初始化的实例</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">merge</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name">State</span><span class="token plain"> state1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token class-name">State</span><span class="token plain"> state2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">throws</span><span class="token plain"> </span><span class="token class-name">IOException</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> state1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">scale </span><span class="token operator">=</span><span class="token plain"> state2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">scale</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> state1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">stringBuilder</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">append</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">state2</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">stringBuilder</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">toString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">//对每个键合并后的数据进行并输出最终结果</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token class-name">Double</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">getValue</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name">State</span><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">throws</span><span class="token plain"> </span><span class="token class-name">IOException</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token class-name">String</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> strings </span><span class="token operator">=</span><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">stringBuilder</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">toString</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">split</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">","</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">double</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> doubles </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">double</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">strings</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">length </span><span class="token operator">+</span><span class="token plain"> </span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> doubles </span><span class="token operator">=</span><span class="token plain"> </span><span class="token class-name">Arrays</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">stream</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">strings</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">mapToDouble</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name">Double</span><span class="token operator">::</span><span class="token function" style="color:rgb(80, 250, 123)">parseDouble</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">toArray</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token class-name">Arrays</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">sort</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">doubles</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">double</span><span class="token plain"> n </span><span class="token operator">=</span><span class="token plain"> doubles</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">length </span><span class="token operator">-</span><span class="token plain"> </span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">double</span><span class="token plain"> index </span><span class="token operator">=</span><span class="token plain"> n </span><span class="token operator">*</span><span class="token plain"> </span><span class="token number">0.5</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> low </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token class-name">Math</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">floor</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">index</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> high </span><span class="token operator">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token class-name">Math</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">ceil</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">index</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">double</span><span class="token plain"> value </span><span class="token operator">=</span><span class="token plain"> low </span><span class="token operator">==</span><span class="token plain"> high </span><span class="token operator">?</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">doubles</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">low</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token plain"> </span><span class="token operator">+</span><span class="token plain"> doubles</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">high</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">*</span><span class="token plain"> </span><span class="token number">0.5</span><span class="token plain"> </span><span class="token operator">:</span><span class="token plain"> doubles</span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">high</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token class-name">BigDecimal</span><span class="token plain"> decimal </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">BigDecimal</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">value</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> decimal</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">setScale</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token plain">scale</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token class-name">BigDecimal</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token constant" style="color:rgb(189, 147, 249)">ROUND_HALF_UP</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">doubleValue</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token comment" style="color:rgb(98, 114, 164)">//每个执行单位执行完都会执行</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">destroy</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name">State</span><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre><div class=buttonGroup__atx><button type=button aria-label=复制代码到剪贴板 title=复制 class=clean-btn><span class=copyButtonIcons_eSgA aria-hidden=true><svg viewBox="0 0 24 24" class=copyButtonIcon_y97N><path fill=currentColor d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"/></svg><svg viewBox="0 0 24 24" class=copyButtonSuccessIcon_LjdS><path fill=currentColor d=M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z /></svg></span></button></div></div></div> |
| </div></div></details> |
| <ol start=2> |
| <li> |
| <p>在 Doris 中注册创建 Java-UDAF 函数。更多语法帮助可参阅 <a href=/zh-CN/docs/dev/query-data/sql-manual/sql-statements/function/CREATE-FUNCTION/>CREATE FUNCTION</a>.</p> |
| <div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_biex><pre tabindex=0 class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><span class=token-line style=color:#F8F8F2><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">CREATE</span><span class="token plain"> AGGREGATE </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">FUNCTION</span><span class="token plain"> simple_demo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INT</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">RETURNS</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INT</span><span class="token plain"> PROPERTIES </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"file"</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"file:///pathTo/java-udaf.jar"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"symbol"</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"org.apache.doris.udf.SimpleDemo"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"always_nullable"</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"true"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"type"</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"JAVA_UDF"</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre><div class=buttonGroup__atx><button type=button aria-label=复制代码到剪贴板 title=复制 class=clean-btn><span class=copyButtonIcons_eSgA aria-hidden=true><svg viewBox="0 0 24 24" class=copyButtonIcon_y97N><path fill=currentColor d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"/></svg><svg viewBox="0 0 24 24" class=copyButtonSuccessIcon_LjdS><path fill=currentColor d=M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z /></svg></span></button></div></div></div> |
| </li> |
| <li> |
| <p>使用 Java-UDAF, 可以分组聚合或者聚合全部结果:</p> |
| <div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_biex><pre tabindex=0 class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><span class=token-line style=color:#F8F8F2><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">select</span><span class="token plain"> simple_demo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> test_table </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">group</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">by</span><span class="token plain"> id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">+</span><span class="token comment" style="color:rgb(98, 114, 164)">-----------------+</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">|</span><span class="token plain"> simple_demo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">+</span><span class="token comment" style="color:rgb(98, 114, 164)">-----------------+</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">|</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">|</span><span class="token plain"> </span><span class="token number">6</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">+</span><span class="token comment" style="color:rgb(98, 114, 164)">-----------------+</span><br></span></code></pre><div class=buttonGroup__atx><button type=button aria-label=复制代码到剪贴板 title=复制 class=clean-btn><span class=copyButtonIcons_eSgA aria-hidden=true><svg viewBox="0 0 24 24" class=copyButtonIcon_y97N><path fill=currentColor d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"/></svg><svg viewBox="0 0 24 24" class=copyButtonSuccessIcon_LjdS><path fill=currentColor d=M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z /></svg></span></button></div></div></div> |
| <div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_biex><pre tabindex=0 class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><span class=token-line style=color:#F8F8F2><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">select</span><span class="token plain"> simple_demo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> test_table</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">+</span><span class="token comment" style="color:rgb(98, 114, 164)">-----------------+</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">|</span><span class="token plain"> simple_demo</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">+</span><span class="token comment" style="color:rgb(98, 114, 164)">-----------------+</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">|</span><span class="token plain"> </span><span class="token number">7</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">+</span><span class="token comment" style="color:rgb(98, 114, 164)">-----------------+</span><br></span></code></pre><div class=buttonGroup__atx><button type=button aria-label=复制代码到剪贴板 title=复制 class=clean-btn><span class=copyButtonIcons_eSgA aria-hidden=true><svg viewBox="0 0 24 24" class=copyButtonIcon_y97N><path fill=currentColor d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"/></svg><svg viewBox="0 0 24 24" class=copyButtonSuccessIcon_LjdS><path fill=currentColor d=M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z /></svg></span></button></div></div></div> |
| </li> |
| </ol> |
| <h3 class="anchor anchorWithStickyNavbar_LWe7" id=java-udwf-实例介绍>Java-UDWF 实例介绍<a href=#java-udwf-实例介绍 class=hash-link aria-label="Java-UDWF 实例介绍的直接链接" title="Java-UDWF 实例介绍的直接链接"></a></h3> |
| <ol> |
| <li> |
| <p>首先编写对应的 Java UDWF 代码,打包生成 JAR 包,它与 Java UDAF 的代码编写是一致的,仅需要实现额外 reset 的接口,将所有的 state 状态置为初始值:</p> |
| <div class="language-JAVA language-java codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_biex><pre tabindex=0 class="prism-code language-java codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><span class=token-line style=color:#F8F8F2><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">void</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">reset</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name">State</span><span class="token plain"> state</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><br></span></code></pre><div class=buttonGroup__atx><button type=button aria-label=复制代码到剪贴板 title=复制 class=clean-btn><span class=copyButtonIcons_eSgA aria-hidden=true><svg viewBox="0 0 24 24" class=copyButtonIcon_y97N><path fill=currentColor d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"/></svg><svg viewBox="0 0 24 24" class=copyButtonSuccessIcon_LjdS><path fill=currentColor d=M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z /></svg></span></button></div></div></div> |
| </li> |
| <li> |
| <p>在 Doris 中注册创建 Java-UDWF 函数,与注册 Java-UDAF 一样。更多语法帮助可参阅 <a href=/zh-CN/docs/dev/query-data/sql-manual/sql-statements/function/CREATE-FUNCTION/>CREATE FUNCTION</a>.</p> |
| <div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_biex><pre tabindex=0 class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><span class=token-line style=color:#F8F8F2><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">CREATE</span><span class="token plain"> AGGREGATE </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">FUNCTION</span><span class="token plain"> simple_demo_window</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INT</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">RETURNS</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">INT</span><span class="token plain"> PROPERTIES </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"file"</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"file:///pathTo/java-udaf.jar"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"symbol"</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"org.apache.doris.udf.SimpleDemo"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"always_nullable"</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"true"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"type"</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"JAVA_UDF"</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre><div class=buttonGroup__atx><button type=button aria-label=复制代码到剪贴板 title=复制 class=clean-btn><span class=copyButtonIcons_eSgA aria-hidden=true><svg viewBox="0 0 24 24" class=copyButtonIcon_y97N><path fill=currentColor d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"/></svg><svg viewBox="0 0 24 24" class=copyButtonSuccessIcon_LjdS><path fill=currentColor d=M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z /></svg></span></button></div></div></div> |
| </li> |
| <li> |
| <p>使用 Java-UDWF, 可以查询在特定窗口内的计算结果,更多语法可以参考<a href=/zh-CN/docs/dev/query-data/window-function/>窗口函数</a>:</p> |
| <div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_biex><pre tabindex=0 class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><span class=token-line style=color:#F8F8F2><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">select</span><span class="token plain"> id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> simple_demo_window</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">over</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">partition</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">by</span><span class="token plain"> id </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">order</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">by</span><span class="token plain"> d1 </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">rows</span><span class="token plain"> </span><span class="token operator">between</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">preceding</span><span class="token plain"> </span><span class="token operator">and</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">following</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">as</span><span class="token plain"> res </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> test_table</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token operator">+</span><span class="token comment" style="color:rgb(98, 114, 164)">------+------+</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> id </span><span class="token operator">|</span><span class="token plain"> res </span><span class="token operator">|</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token operator">+</span><span class="token comment" style="color:rgb(98, 114, 164)">------+------+</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token number">6</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> </span><span class="token number">6</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token operator">+</span><span class="token comment" style="color:rgb(98, 114, 164)">------+------+</span><br></span></code></pre><div class=buttonGroup__atx><button type=button aria-label=复制代码到剪贴板 title=复制 class=clean-btn><span class=copyButtonIcons_eSgA aria-hidden=true><svg viewBox="0 0 24 24" class=copyButtonIcon_y97N><path fill=currentColor d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"/></svg><svg viewBox="0 0 24 24" class=copyButtonSuccessIcon_LjdS><path fill=currentColor d=M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z /></svg></span></button></div></div></div> |
| </li> |
| </ol> |
| <h3 class="anchor anchorWithStickyNavbar_LWe7" id=java-udtf-实例介绍>Java-UDTF 实例介绍<a href=#java-udtf-实例介绍 class=hash-link aria-label="Java-UDTF 实例介绍的直接链接" title="Java-UDTF 实例介绍的直接链接"></a></h3> |
| <div class="theme-admonition theme-admonition-tip admonition_Gfwi alert alert--success"><div class=admonitionHeading_f1Ed>提示</div><div class=admonitionContent_UjKb><p>UDTF 自 Doris 3.0 版本开始支持,</div></div> |
| <ol> |
| <li> |
| <p>首先编写对应的 Java UDTF 代码,打包生成 JAR 包。 |
| UDTF 和 UDF 函数一样,需要用户自主实现一个 <code>evaluate</code> 方法,但是 UDTF 函数的返回值必须是 Array 类型。</p> |
| <div class="language-JAVA language-java codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_biex><pre tabindex=0 class="prism-code language-java codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><span class=token-line style=color:#F8F8F2><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">UDTFStringTest</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token class-name">ArrayList</span><span class="token generics punctuation" style="color:rgb(248, 248, 242)"><</span><span class="token generics class-name">String</span><span class="token generics punctuation" style="color:rgb(248, 248, 242)">></span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">evaluate</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name">String</span><span class="token plain"> value</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> separator</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">value </span><span class="token operator">==</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token plain"> </span><span class="token operator">||</span><span class="token plain"> separator </span><span class="token operator">==</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">ArrayList</span><span class="token generics punctuation" style="color:rgb(248, 248, 242)"><</span><span class="token generics punctuation" style="color:rgb(248, 248, 242)">></span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name">Arrays</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">asList</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">value</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">split</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">separator</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre><div class=buttonGroup__atx><button type=button aria-label=复制代码到剪贴板 title=复制 class=clean-btn><span class=copyButtonIcons_eSgA aria-hidden=true><svg viewBox="0 0 24 24" class=copyButtonIcon_y97N><path fill=currentColor d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"/></svg><svg viewBox="0 0 24 24" class=copyButtonSuccessIcon_LjdS><path fill=currentColor d=M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z /></svg></span></button></div></div></div> |
| </li> |
| <li> |
| <p>在 Doris 中注册创建 Java-UDTF 函数。此时会注册两个 UTDF 函数,另外一个是在函数名后面加上 <code>_outer</code> 后缀,其中带后缀 <code>_outer</code> 的是针对结果为 0 行时的特殊处理,具体可查看<a href=/zh-CN/docs/dev/query-data/sql-manual/sql-functions/table-functions/explode-numbers/>OUTER 组合器</a>。 |
| 更多语法帮助可参阅 <a href=/zh-CN/docs/dev/query-data/sql-manual/sql-statements/function/CREATE-FUNCTION/>CREATE FUNCTION</a>.</p> |
| <div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_biex><pre tabindex=0 class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><span class=token-line style=color:#F8F8F2><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">CREATE</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">TABLES</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">FUNCTION</span><span class="token plain"> java</span><span class="token operator">-</span><span class="token plain">utdf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">string</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> string</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">RETURNS</span><span class="token plain"> array</span><span class="token operator"><</span><span class="token plain">string</span><span class="token operator">></span><span class="token plain"> PROPERTIES </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"file"</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"file:///pathTo/java-udtf.jar"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"symbol"</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"org.apache.doris.udf.demo.UDTFStringTest"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"always_nullable"</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"true"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"type"</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"JAVA_UDF"</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre><div class=buttonGroup__atx><button type=button aria-label=复制代码到剪贴板 title=复制 class=clean-btn><span class=copyButtonIcons_eSgA aria-hidden=true><svg viewBox="0 0 24 24" class=copyButtonIcon_y97N><path fill=currentColor d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"/></svg><svg viewBox="0 0 24 24" class=copyButtonSuccessIcon_LjdS><path fill=currentColor d=M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z /></svg></span></button></div></div></div> |
| </li> |
| <li> |
| <p>使用 Java-UDTF, 在 Doris 中使用 UDTF 需要结合 <a href=/zh-CN/docs/dev/query-data/lateral-view/>Lateral View</a>, 实现行转列的效果 :</p> |
| <div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_biex><pre tabindex=0 class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><span class=token-line style=color:#F8F8F2><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">select</span><span class="token plain"> id</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> str</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> e1 </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">from</span><span class="token plain"> test_table lateral </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">view</span><span class="token plain"> java_utdf</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">str</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token string" style="color:rgb(255, 121, 198)">','</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> tmp </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">as</span><span class="token plain"> e1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">+</span><span class="token comment" style="color:rgb(98, 114, 164)">------+-------+------+</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">|</span><span class="token plain"> id </span><span class="token operator">|</span><span class="token plain"> str </span><span class="token operator">|</span><span class="token plain"> e1 </span><span class="token operator">|</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">+</span><span class="token comment" style="color:rgb(98, 114, 164)">------+-------+------+</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">|</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> a</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">b</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">c </span><span class="token operator">|</span><span class="token plain"> a </span><span class="token operator">|</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">|</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> a</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">b</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">c </span><span class="token operator">|</span><span class="token plain"> b </span><span class="token operator">|</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">|</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> a</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">b</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">c </span><span class="token operator">|</span><span class="token plain"> c </span><span class="token operator">|</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">|</span><span class="token plain"> </span><span class="token number">6</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> d</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">e </span><span class="token operator">|</span><span class="token plain"> d </span><span class="token operator">|</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">|</span><span class="token plain"> </span><span class="token number">6</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"> d</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain">e </span><span class="token operator">|</span><span class="token plain"> e </span><span class="token operator">|</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">+</span><span class="token comment" style="color:rgb(98, 114, 164)">------+-------+------+</span><br></span></code></pre><div class=buttonGroup__atx><button type=button aria-label=复制代码到剪贴板 title=复制 class=clean-btn><span class=copyButtonIcons_eSgA aria-hidden=true><svg viewBox="0 0 24 24" class=copyButtonIcon_y97N><path fill=currentColor d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"/></svg><svg viewBox="0 0 24 24" class=copyButtonSuccessIcon_LjdS><path fill=currentColor d=M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z /></svg></span></button></div></div></div> |
| </li> |
| </ol> |
| <h2 class="anchor anchorWithStickyNavbar_LWe7" id=最佳实践>最佳实践<a href=#最佳实践 class=hash-link aria-label=最佳实践的直接链接 title=最佳实践的直接链接></a></h2> |
| <p><em>Static 变量加载</em></p> |
| <p>当前在 Doris 中,执行一个 UDF 函数,例如 <code>select udf(col) from table</code>, 每一个并发 Instance 会加载一次 udf.jar 包,在该 Instance 结束时卸载掉 udf.jar 包。</p> |
| <p>所以当 udf.jar 文件中需要加载一个几百 MB 的文件时,会因为并发的原因,使得占据的内存急剧增大,容易 OOM。 |
| 或者想使用一个连接池时,这样无法做到仅在 static 区域初始化一次。</p> |
| <p>这里提供两个解决方案,其中方案二需要 Doris 版本在 branch-3.0 以上才行。</p> |
| <p><em>解决方案 1:</em></p> |
| <p>可以将资源加载代码拆分开,单独生成一个 JAR 包文件,然后其他包直接引用该资源 JAR 包。</p> |
| <p>假设已经将代码拆分为了 DictLibrary 和 FunctionUdf 两个文件。</p> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_biex><pre tabindex=0 class="prism-code language-java codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><span class=token-line style=color:#F8F8F2><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">DictLibrary</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">private</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">static</span><span class="token plain"> </span><span class="token class-name">HashMap</span><span class="token generics punctuation" style="color:rgb(248, 248, 242)"><</span><span class="token generics class-name">String</span><span class="token generics punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token generics"> </span><span class="token generics class-name">String</span><span class="token generics punctuation" style="color:rgb(248, 248, 242)">></span><span class="token plain"> res </span><span class="token operator">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">new</span><span class="token plain"> </span><span class="token class-name">HashMap</span><span class="token generics punctuation" style="color:rgb(248, 248, 242)"><</span><span class="token generics punctuation" style="color:rgb(248, 248, 242)">></span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">static</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// suppose we built this dictionary from a certain local file.</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> res</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">put</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"key1"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"value1"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> res</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">put</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"key2"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"value2"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> res</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">put</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"key3"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"value3"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> res</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">put</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"0"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"value4"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> res</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">put</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"1"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"value5"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> res</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">put</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token string" style="color:rgb(255, 121, 198)">"2"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"value6"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">static</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">evaluate</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name">String</span><span class="token plain"> key</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">key </span><span class="token operator">==</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">null</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> res</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">get</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">key</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre><div class=buttonGroup__atx><button type=button aria-label=复制代码到剪贴板 title=复制 class=clean-btn><span class=copyButtonIcons_eSgA aria-hidden=true><svg viewBox="0 0 24 24" class=copyButtonIcon_y97N><path fill=currentColor d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"/></svg><svg viewBox="0 0 24 24" class=copyButtonSuccessIcon_LjdS><path fill=currentColor d=M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z /></svg></span></button></div></div></div> |
| <div class="language-java codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_biex><pre tabindex=0 class="prism-code language-java codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><span class=token-line style=color:#F8F8F2><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">class</span><span class="token plain"> </span><span class="token class-name">FunctionUdf</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> </span><span class="token function" style="color:rgb(80, 250, 123)">evaluate</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token class-name">String</span><span class="token plain"> key</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">{</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token class-name">String</span><span class="token plain"> value </span><span class="token operator">=</span><span class="token plain"> </span><span class="token class-name">DictLibrary</span><span class="token punctuation" style="color:rgb(248, 248, 242)">.</span><span class="token function" style="color:rgb(80, 250, 123)">evaluate</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">key</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> value</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">}</span><br></span></code></pre><div class=buttonGroup__atx><button type=button aria-label=复制代码到剪贴板 title=复制 class=clean-btn><span class=copyButtonIcons_eSgA aria-hidden=true><svg viewBox="0 0 24 24" class=copyButtonIcon_y97N><path fill=currentColor d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"/></svg><svg viewBox="0 0 24 24" class=copyButtonSuccessIcon_LjdS><path fill=currentColor d=M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z /></svg></span></button></div></div></div> |
| <ol> |
| <li> |
| <p>单独编译 DictLibrary 文件,使其生成一个独立的 JAR 包,这样可以得到一个资源文件包 DictLibrary.jar:</p> |
| <div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_biex><pre tabindex=0 class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><span class=token-line style=color:#F8F8F2><span class="token plain">javac ./DictLibrary.java</span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain">jar -cf ./DictLibrary.jar ./DictLibrary.class</span><br></span></code></pre><div class=buttonGroup__atx><button type=button aria-label=复制代码到剪贴板 title=复制 class=clean-btn><span class=copyButtonIcons_eSgA aria-hidden=true><svg viewBox="0 0 24 24" class=copyButtonIcon_y97N><path fill=currentColor d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"/></svg><svg viewBox="0 0 24 24" class=copyButtonSuccessIcon_LjdS><path fill=currentColor d=M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z /></svg></span></button></div></div></div> |
| </li> |
| <li> |
| <p>编译 FunctionUdf 文件,需要引用上一步得到的资源包作为库使用,这样打包后可以得到 UDF 的 FunctionUdf.jar 包。</p> |
| <div class="language-shell codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_biex><pre tabindex=0 class="prism-code language-shell codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><span class=token-line style=color:#F8F8F2><span class="token plain">javac -cp ./DictLibrary.jar ./FunctionUdf.java</span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain">jar -cvf ./FunctionUdf.jar ./FunctionUdf.class</span><br></span></code></pre><div class=buttonGroup__atx><button type=button aria-label=复制代码到剪贴板 title=复制 class=clean-btn><span class=copyButtonIcons_eSgA aria-hidden=true><svg viewBox="0 0 24 24" class=copyButtonIcon_y97N><path fill=currentColor d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"/></svg><svg viewBox="0 0 24 24" class=copyButtonSuccessIcon_LjdS><path fill=currentColor d=M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z /></svg></span></button></div></div></div> |
| </li> |
| <li> |
| <p>由于想让资源 JAR 包被所有的并发引用,所以想让它被 JVM 直接加载,可以将它放到指定路径 <code>be/custom_lib</code> 下面,BE 服务重启之后就可以随着 JVM 的启动加载进来,因此都会随着服务启动而加载,停止而释放。</p> |
| </li> |
| <li> |
| <p>最后利用 <code>CREATE FUNCTION</code> 语句创建一个 UDF 函数,这样每次卸载仅是 FunctionUdf.jar。</p> |
| <div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_biex><pre tabindex=0 class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><span class=token-line style=color:#F8F8F2><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">CREATE</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">FUNCTION</span><span class="token plain"> java_udf_dict</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain">string</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">RETURNS</span><span class="token plain"> string PROPERTIES </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"file"</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"file:///pathTo/FunctionUdf.jar"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"symbol"</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"org.apache.doris.udf.FunctionUdf"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"always_nullable"</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"true"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"type"</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"JAVA_UDF"</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre><div class=buttonGroup__atx><button type=button aria-label=复制代码到剪贴板 title=复制 class=clean-btn><span class=copyButtonIcons_eSgA aria-hidden=true><svg viewBox="0 0 24 24" class=copyButtonIcon_y97N><path fill=currentColor d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"/></svg><svg viewBox="0 0 24 24" class=copyButtonSuccessIcon_LjdS><path fill=currentColor d=M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z /></svg></span></button></div></div></div> |
| </li> |
| </ol> |
| <p><em>解决方案 2:</em></p> |
| <p>BE 全局缓存 JAR 包,自定义过期淘汰时间,在 create function 时增加两个属性字段,其中 |
| static_load: 用于定义是否使用静态 cache 加载的方式。</p> |
| <p>expiration_time: 用于定义 JAR 包的过期时间,单位为分钟。</p> |
| <p>若使用静态 cache 加载方式,则在第一次调用该 UDF 函数时,在初始化之后会将该 UDF 的实例缓存起来,在下次调用该 UDF 时,首先会在 cache 中进行查找,如果没有找到,则会进行相关初始化操作。</p> |
| <p>并且后台有线程定期检查,如果在配置的过期淘汰时间内,一直没有被调用过,则会从缓存 cache 中清理掉。如果被调用时,则会自动更新缓存时间点。</p> |
| <div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_biex><pre tabindex=0 class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><span class=token-line style=color:#F8F8F2><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> class </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">Print</span><span class="token plain"> extends UDF {</span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> static </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">Integer</span><span class="token plain"> val </span><span class="token operator">=</span><span class="token plain"> </span><span class="token number">0</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">public</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">Integer</span><span class="token plain"> evaluate</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> {</span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> val </span><span class="token operator">=</span><span class="token plain"> val </span><span class="token operator">+</span><span class="token plain"> </span><span class="token number">1</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">return</span><span class="token plain"> val</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> }</span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain">}</span><br></span></code></pre><div class=buttonGroup__atx><button type=button aria-label=复制代码到剪贴板 title=复制 class=clean-btn><span class=copyButtonIcons_eSgA aria-hidden=true><svg viewBox="0 0 24 24" class=copyButtonIcon_y97N><path fill=currentColor d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"/></svg><svg viewBox="0 0 24 24" class=copyButtonSuccessIcon_LjdS><path fill=currentColor d=M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z /></svg></span></button></div></div></div> |
| <div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_biex><pre tabindex=0 class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><span class=token-line style=color:#F8F8F2><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">CREATE</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">FUNCTION</span><span class="token plain"> print_12</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">RETURNS</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">int</span><span class="token plain"> </span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain">PROPERTIES </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"file"</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"file:///path/to/java-udf-demo-jar-with-dependencies.jar"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"symbol"</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"org.apache.doris.udf.Print"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"always_nullable"</span><span class="token operator">=</span><span class="token string" style="color:rgb(255, 121, 198)">"true"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"type"</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"JAVA_UDF"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"static_load"</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"true"</span><span class="token punctuation" style="color:rgb(248, 248, 242)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// default value is false</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"expiration_time"</span><span class="token plain"> </span><span class="token operator">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(255, 121, 198)">"60"</span><span class="token plain"> </span><span class="token comment" style="color:rgb(98, 114, 164)">// default value is 360 minutes</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><br></span></code></pre><div class=buttonGroup__atx><button type=button aria-label=复制代码到剪贴板 title=复制 class=clean-btn><span class=copyButtonIcons_eSgA aria-hidden=true><svg viewBox="0 0 24 24" class=copyButtonIcon_y97N><path fill=currentColor d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"/></svg><svg viewBox="0 0 24 24" class=copyButtonSuccessIcon_LjdS><path fill=currentColor d=M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z /></svg></span></button></div></div></div> |
| <p>可以看到结果是一直在递增的,证明加载的 JAR 包没有被卸载后又加载,导致重新初始化变量为 0.</p> |
| <div class="language-sql codeBlockContainer_Ckt0 theme-code-block" style=--prism-color:#F8F8F2;--prism-background-color:#282A36><div class=codeBlockContent_biex><pre tabindex=0 class="prism-code language-sql codeBlock_bY9V thin-scrollbar" style=color:#F8F8F2;background-color:#282A36><code class=codeBlockLines_e6Vv><span class=token-line style=color:#F8F8F2><span class="token plain">mysql </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">test_query_qa</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token operator">></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">select</span><span class="token plain"> print_12</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">+</span><span class="token comment" style="color:rgb(98, 114, 164)">------------+</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">|</span><span class="token plain"> print_12</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">+</span><span class="token comment" style="color:rgb(98, 114, 164)">------------+</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">|</span><span class="token plain"> </span><span class="token number">1</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">+</span><span class="token comment" style="color:rgb(98, 114, 164)">------------+</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token number">1</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">row</span><span class="token plain"> </span><span class="token operator">in</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">set</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">0.40</span><span class="token plain"> sec</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain">mysql </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">test_query_qa</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token operator">></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">select</span><span class="token plain"> print_12</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">+</span><span class="token comment" style="color:rgb(98, 114, 164)">------------+</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">|</span><span class="token plain"> print_12</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">+</span><span class="token comment" style="color:rgb(98, 114, 164)">------------+</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">|</span><span class="token plain"> </span><span class="token number">2</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">+</span><span class="token comment" style="color:rgb(98, 114, 164)">------------+</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token number">1</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">row</span><span class="token plain"> </span><span class="token operator">in</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">set</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">0.03</span><span class="token plain"> sec</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain">mysql </span><span class="token punctuation" style="color:rgb(248, 248, 242)">[</span><span class="token plain">test_query_qa</span><span class="token punctuation" style="color:rgb(248, 248, 242)">]</span><span class="token operator">></span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">select</span><span class="token plain"> print_12</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token punctuation" style="color:rgb(248, 248, 242)">;</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">+</span><span class="token comment" style="color:rgb(98, 114, 164)">------------+</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">|</span><span class="token plain"> print_12</span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">+</span><span class="token comment" style="color:rgb(98, 114, 164)">------------+</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">|</span><span class="token plain"> </span><span class="token number">3</span><span class="token plain"> </span><span class="token operator">|</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token operator">+</span><span class="token comment" style="color:rgb(98, 114, 164)">------------+</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain"></span><span class="token number">1</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">row</span><span class="token plain"> </span><span class="token operator">in</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(189, 147, 249);font-style:italic">set</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(248, 248, 242)">(</span><span class="token number">0.04</span><span class="token plain"> sec</span><span class="token punctuation" style="color:rgb(248, 248, 242)">)</span><span class="token plain"></span><br></span><span class=token-line style=color:#F8F8F2><span class="token plain" style=display:inline-block></span><br></span></code></pre><div class=buttonGroup__atx><button type=button aria-label=复制代码到剪贴板 title=复制 class=clean-btn><span class=copyButtonIcons_eSgA aria-hidden=true><svg viewBox="0 0 24 24" class=copyButtonIcon_y97N><path fill=currentColor d="M19,21H8V7H19M19,5H8A2,2 0 0,0 6,7V21A2,2 0 0,0 8,23H19A2,2 0 0,0 21,21V7A2,2 0 0,0 19,5M16,1H4A2,2 0 0,0 2,3V17H4V3H16V1Z"/></svg><svg viewBox="0 0 24 24" class=copyButtonSuccessIcon_LjdS><path fill=currentColor d=M21,7L9,19L3.5,13.5L4.91,12.09L9,16.17L19.59,5.59L21,7Z /></svg></span></button></div></div></div></div></article><div class="flex items-center text-sm lg:text-base justify-end lg:col mt-10"><a href="https://github.com/apache/doris-website/issues/new?title=Issue on docs&body=Path:false" target=_blank rel="noopener noreferrer" class="lg:mr-6 footerBtn_e3I8"><svg width=20 height=20 viewBox="0 0 20 20" fill=none><path d="M9.48038 2.9C9.71132 2.5 10.2887 2.5 10.5196 2.9L18.1406 16.1C18.3716 16.5 18.0829 17 17.621 17H2.37898C1.9171 17 1.62842 16.5 1.85936 16.1L9.48038 2.9Z" stroke=currentColor stroke-width=1.2 stroke-linecap=round /><path d="M10.5699 7.9516C10.5874 7.5628 10.2769 7.23804 9.88766 7.23804C9.49847 7.23804 9.18796 7.5628 9.20543 7.9516L9.41597 12.6385C9.42731 12.8908 9.63513 13.0895 9.88766 13.0895C10.1402 13.0895 10.348 12.8908 10.3593 12.6385L10.5699 7.9516ZM9.89338 13.7638C9.65338 13.7638 9.44766 13.8323 9.28766 13.9923C9.12766 14.1409 9.04766 14.3352 9.04766 14.5752C9.04766 14.8152 9.12766 15.0095 9.28766 15.1695C9.45909 15.318 9.6648 15.398 9.89338 15.398C10.1219 15.398 10.3162 15.318 10.4762 15.158C10.6477 14.998 10.7277 14.8038 10.7277 14.5752C10.7277 14.3352 10.6477 14.1409 10.4762 13.9923C10.3162 13.8323 10.1219 13.7638 9.89338 13.7638Z" fill=currentColor /></svg> <span class=ml-2>Report issue</span></a></div><nav class="pagination-nav docusaurus-mt-lg" aria-label=文件选项卡><a class="pagination-nav__link pagination-nav__link--prev" href=/zh-CN/docs/dev/query-data/udf/alias-function/><div class=pagination-nav__sublabel>上一页</div><div class=pagination-nav__label>别名函数</div></a><a class="pagination-nav__link pagination-nav__link--next" href=/zh-CN/docs/dev/query-data/complex-type/><div class=pagination-nav__sublabel>下一页</div><div class=pagination-nav__label>复杂类型查询</div></a></nav></div></div><div class="col col--3"><div class="tableOfContents_jeP5 thin-scrollbar toc-container theme-doc-toc-desktop"><div><a href=/zh-CN/><div class="toc-icon-content group"><svg width=21 height=20 fill=currentColor viewBox="0 0 21 20" class=group-hover:text-[#444FD9]><path fill-rule=evenodd d="M3.835 6.44a1 1 0 0 0-.445.832v8.939c0 .436.354.79.79.79H16.81a.79.79 0 0 0 .79-.79V7.272a1 1 0 0 0-.446-.832L11.05 2.37a1 1 0 0 0-1.11 0zm7.26 4.16a.6.6 0 1 0-1.2 0v3.3a.6.6 0 0 0 1.2 0z" clip-rule=evenodd /></svg><span class=group-hover:text-[#444FD9]>Doris 首页</span></div></a><div class="cursor-pointer toc-icon-content group"><svg class=group-hover:text-[#444FD9] width=21 height=20 fill=currentColor viewBox="0 0 21 20"><path d="M15.944 3H5.056C4.2 3 3.5 3.7 3.5 4.556v10.888C3.5 16.3 4.2 17 5.056 17h10.888c.856 0 1.556-.7 1.556-1.556V4.557C17.5 3.7 16.8 3 15.944 3m-5.791 5.998c-.179.575-.384 1.466-.686 2.197-.156.396-.149.327-.266.577l.101-.033c1.04-.29 1.767-.363 2.444-.487-.136-.107-.254-.19-.348-.276-.464-.515-.627-.611-1.245-1.978m5.1 3.297c-.133.147-.366.233-.708.233-.591 0-1.129-.163-1.906-.56-1.338.148-2.761.304-3.562.561q-.06.02-.14.055c-.965 1.648-1.68 2.347-2.31 2.32-.2-.01-.49-.125-.583-.18l-.116-.109-.04-.077a.7.7 0 0 1-.039-.42c.086-.412.529-1.065 1.462-1.649.148-.109.485-.281.796-.429.236-.374.345-.614.643-1.278a23 23 0 0 0 .84-2.443V8.31c-.288-.941-.459-1.58-.171-2.614.07-.296.327-.6.614-.6h.187c.179 0 .35.063.475.188.513.513.272 1.836.015 2.87q-.02.072-.031.109c.311.879.803 1.747 1.293 2.151.202.156.4.335.65.475a9 9 0 0 1 .982-.073c.964 0 1.547.17 1.773.536a.63.63 0 0 1 .093.428.75.75 0 0 1-.218.513m-.492-.65c-.078-.078-.301-.3-1.39-.3-.055 0-.188-.014-.258.064.568.249 1.111.438 1.469.438q.08-.002.148-.016h.03c.04-.015.063-.023.07-.1-.015-.024-.03-.055-.07-.086m-6.846 1.114a3 3 0 0 0-.374.242c-.552.505-.902 1.019-.94 1.314.35-.117.808-.63 1.314-1.556m2.22-5.266.04-.031c.054-.25.092-.517.139-.688l.023-.124c.078-.444.048-.703-.084-.89l-.117-.038q-.03.045-.054.093c-.133.327-.125.978.053 1.678"/></svg><span class="group-hover:text-[#444FD9] mr-2">下载 PDF</span><div class="ant-spin ant-spin-sm css-1v613y0" aria-live=polite aria-busy=false><span class=ant-spin-dot-holder><span class="ant-spin-dot ant-spin-dot-spin"><i class=ant-spin-dot-item></i><i class=ant-spin-dot-item></i><i class=ant-spin-dot-item></i><i class=ant-spin-dot-item></i></span></span></div></div><a href=https://doris-forum.org.cn target=_blank rel="noopener noreferrer"><div class="toc-icon-content group"><svg width=20 height=20 fill=none viewBox="0 0 20 20" class=group-hover:text-[#444FD9]><g clip-path=url(#a)><path fill=currentColor fill-rule=evenodd d="M3.75 3a.75.75 0 0 0-.75.75v9.519c0 .414.336.75.75.75h1.884v2.3a.4.4 0 0 0 .595.349l4.577-2.554a.75.75 0 0 1 .366-.095h5.078a.75.75 0 0 0 .75-.75V3.75a.75.75 0 0 0-.75-.75zM7.5 8.5a1 1 0 1 1-2 0 1 1 0 0 1 2 0m3.5 0a1 1 0 1 1-2 0 1 1 0 0 1 2 0m2.5 1a1 1 0 1 0 0-2 1 1 0 0 0 0 2" clip-rule=evenodd /></g><defs><clipPath id=a><path fill=#fff d="M0 0h20v20H0z"/></clipPath></defs></svg> <span class=group-hover:text-[#444FD9]>技术论坛</span></div></a></div><div><span class="ml-4 title-text">本页导航</span><ul class="table-of-contents table-of-contents__left-border"><li><a href=#概述 class="table-of-contents__link toc-highlight">概述</a><li><a href=#类型对应关系 class="table-of-contents__link toc-highlight">类型对应关系</a><li><a href=#使用限制 class="table-of-contents__link toc-highlight">使用限制</a><li><a href=#快速上手 class="table-of-contents__link toc-highlight">快速上手</a><ul><li><a href=#java-udf-实例介绍 class="table-of-contents__link toc-highlight">Java-UDF 实例介绍</a><li><a href=#java-udaf-实例介绍 class="table-of-contents__link toc-highlight">Java-UDAF 实例介绍</a><li><a href=#java-udwf-实例介绍 class="table-of-contents__link toc-highlight">Java-UDWF 实例介绍</a><li><a href=#java-udtf-实例介绍 class="table-of-contents__link toc-highlight">Java-UDTF 实例介绍</a></ul><li><a href=#最佳实践 class="table-of-contents__link toc-highlight">最佳实践</a></ul></div></div></div></div></div></main></div></div></div><div class="footer pt-16 pb-10"><div class=container><div class=footer-box><div class=left><img src=/zh-CN/images/asf_logo_apache.svg alt="" class="footer__logo themedComponent_mlkZ themedComponent--light_NVdE"><img src=/zh-CN/images/asf_logo_apache.svg alt="" class="footer__logo themedComponent_mlkZ themedComponent--dark_xIcU"><div class="row footer__links"><div class="col footer__col"><div class=footer__title>ASF</div><ul class="footer__items clean-list"><li class=footer__item><a href=https://www.apache.org/ target=_blank rel="noopener noreferrer" class=footer__link-item>Foundation<svg width=13.5 height=13.5 aria-hidden=true viewBox="0 0 24 24" class=iconExternalLink_nPIU><path fill=currentColor d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></svg></a><li class=footer__item><a href=https://www.apache.org/licenses/ target=_blank rel="noopener noreferrer" class=footer__link-item>License<svg width=13.5 height=13.5 aria-hidden=true viewBox="0 0 24 24" class=iconExternalLink_nPIU><path fill=currentColor d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></svg></a><li class=footer__item><a href=https://www.apache.org/events/current-event target=_blank rel="noopener noreferrer" class=footer__link-item>Events<svg width=13.5 height=13.5 aria-hidden=true viewBox="0 0 24 24" class=iconExternalLink_nPIU><path fill=currentColor d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></svg></a><li class=footer__item><a href=https://www.apache.org/foundation/sponsorship.html target=_blank rel="noopener noreferrer" class=footer__link-item>Sponsorship<svg width=13.5 height=13.5 aria-hidden=true viewBox="0 0 24 24" class=iconExternalLink_nPIU><path fill=currentColor d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></svg></a><li class=footer__item><a href=https://privacy.apache.org/policies/privacy-policy-public.html target=_blank rel="noopener noreferrer" class=footer__link-item>Privacy<svg width=13.5 height=13.5 aria-hidden=true viewBox="0 0 24 24" class=iconExternalLink_nPIU><path fill=currentColor d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></svg></a><li class=footer__item><a href=https://www.apache.org/security/ target=_blank rel="noopener noreferrer" class=footer__link-item>Security<svg width=13.5 height=13.5 aria-hidden=true viewBox="0 0 24 24" class=iconExternalLink_nPIU><path fill=currentColor d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></svg></a><li class=footer__item><a href=https://www.apache.org/foundation/thanks.html target=_blank rel="noopener noreferrer" class=footer__link-item>Thanks<svg width=13.5 height=13.5 aria-hidden=true viewBox="0 0 24 24" class=iconExternalLink_nPIU><path fill=currentColor d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></svg></a></ul></div><div class="col footer__col"><div class=footer__title>Resources</div><ul class="footer__items clean-list"><li class=footer__item><a class=footer__link-item href=/zh-CN/download/>Download</a><li class=footer__item><a class=footer__link-item href=/zh-CN/blog/>Blog</a><li class=footer__item><a class=footer__link-item href=/zh-CN/ecosystem/cluster-management/>Ecosystem</a><li class=footer__item><a class=footer__link-item href=/zh-CN/users/>Users</a><li class=footer__item><a href=https://github.com/apache/doris/discussions target=_blank rel="noopener noreferrer" class=footer__link-item>Discussions<svg width=13.5 height=13.5 aria-hidden=true viewBox="0 0 24 24" class=iconExternalLink_nPIU><path fill=currentColor d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></svg></a></ul></div><div class="col footer__col"><div class=footer__title>Community</div><ul class="footer__items clean-list"><li class=footer__item><a class=footer__link-item href=/zh-CN/community/how-to-contribute/contribute-to-doris/>How to contribute</a><li class=footer__item><a href=https://github.com/apache/doris/ target=_blank rel="noopener noreferrer" class=footer__link-item>Source code<svg width=13.5 height=13.5 aria-hidden=true viewBox="0 0 24 24" class=iconExternalLink_nPIU><path fill=currentColor d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></svg></a><li class=footer__item><a class=footer__link-item href=/zh-CN/community/team/>Doris team</a><li class=footer__item><a href=https://github.com/apache/doris/issues/30669 target=_blank rel="noopener noreferrer" class=footer__link-item>Roadmap<svg width=13.5 height=13.5 aria-hidden=true viewBox="0 0 24 24" class=iconExternalLink_nPIU><path fill=currentColor d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></svg></a><li class=footer__item><a href=https://cwiki.apache.org/confluence/display/DORIS/Doris+Improvement+Proposals target=_blank rel="noopener noreferrer" class=footer__link-item>Improvement proposal<svg width=13.5 height=13.5 aria-hidden=true viewBox="0 0 24 24" class=iconExternalLink_nPIU><path fill=currentColor d="M21 13v10h-21v-19h12v2h-10v15h17v-8h2zm3-12h-10.988l4.035 4-6.977 7.07 2.828 2.828 6.977-7.07 4.125 4.172v-11z"/></svg></a></ul></div></div></div><div class=right><div class=footer__title>Join the community</div><div class=social-list><div class=social><a href=mailto:dev@doris.apache.org target=_blank title=mail class=item><svg width=2em height=2em viewBox="0 0 32 32" fill=none><path d="M5.6003 6H26.3997C27.8186 6 28.982 7.10964 29 8.46946L16.0045 15.454L3.01202 8.47829C3.02405 7.11258 4.1784 6 5.6003 6ZM3.01202 11.1508L3 23.5011C3 24.8756 4.16938 26 5.6003 26H26.3997C27.8306 26 29 24.8756 29 23.5011V11.145L16.3111 17.8028C16.1157 17.9058 15.8813 17.9058 15.6889 17.8028L3.01202 11.1508Z" fill=currentColor /></svg></a><a href=https://github.com/apache/doris target=_blank title=github class=item><svg width=2em height=2em viewBox="0 0 32 32" fill=none><path d="M16.0001 2.66675C8.63342 2.66675 2.66675 8.63341 2.66675 16.0001C2.66524 18.7991 3.54517 21.5276 5.1817 23.7983C6.81824 26.0691 9.12828 27.7668 11.7841 28.6508C12.4508 28.7668 12.7001 28.3668 12.7001 28.0161C12.7001 27.7001 12.6828 26.6508 12.6828 25.5334C9.33342 26.1508 8.46675 24.7174 8.20008 23.9668C8.04942 23.5828 7.40008 22.4001 6.83342 22.0828C6.36675 21.8334 5.70008 21.2161 6.81608 21.2001C7.86675 21.1828 8.61608 22.1668 8.86675 22.5668C10.0668 24.5828 11.9841 24.0161 12.7494 23.6668C12.8668 22.8001 13.2161 22.2174 13.6001 21.8841C10.6334 21.5508 7.53342 20.4001 7.53342 15.3001C7.53342 13.8494 8.04942 12.6507 8.90008 11.7161C8.76675 11.3827 8.30008 10.0161 9.03342 8.18275C9.03342 8.18275 10.1494 7.83342 12.7001 9.55075C13.7855 9.2495 14.907 9.09787 16.0334 9.10008C17.1668 9.10008 18.3001 9.24942 19.3668 9.54942C21.9161 7.81608 23.0334 8.18408 23.0334 8.18408C23.7668 10.0174 23.3001 11.3841 23.1668 11.7174C24.0161 12.6507 24.5334 13.8334 24.5334 15.3001C24.5334 20.4174 21.4174 21.5508 18.4508 21.8841C18.9334 22.3001 19.3508 23.1001 19.3508 24.3508C19.3508 26.1334 19.3334 27.5668 19.3334 28.0174C19.3334 28.3668 19.5841 28.7828 20.2508 28.6494C22.8975 27.7558 25.1973 26.0547 26.8266 23.7856C28.4559 21.5165 29.3327 18.7936 29.3334 16.0001C29.3334 8.63341 23.3668 2.66675 16.0001 2.66675V2.66675Z" fill=currentColor /></svg></a><a href=https://twitter.com/doris_apache target=_blank title=twitter class=item><svg width=2em height=2em viewBox="0 0 32 32" fill=none><path d="M4.625 4.625H11.2809L27.375 27.375H20.7191L4.625 4.625ZM7.52549 6.10639L21.5236 25.8936H24.4746L10.4764 6.10639H7.52549Z" fill=currentColor /><path d="M14.4268 18.4803L6.53447 27.375H4.625L13.5581 17.2525L14.4268 18.4803ZM18.1299 14.3066L26.7203 4.625H24.7017L17.2525 13.0662L18.1299 14.3066Z" fill=currentColor /></svg></a><a href=https://doris.apache.org/slack title=slack target=_blank class=item><svg width=2em height=2em viewBox="0 0 32 32" fill=none><g clip-path=url(#clip0_125_278)><path d="M12.5875 16.6906C11.0844 16.6906 9.86562 17.9094 9.86562 19.4125V26.2375C9.86562 26.9594 10.1524 27.6517 10.6628 28.1622C11.1733 28.6726 11.8656 28.9594 12.5875 28.9594C13.3094 28.9594 14.0017 28.6726 14.5122 28.1622C15.0226 27.6517 15.3094 26.9594 15.3094 26.2375V19.4531C15.3094 17.9094 14.0906 16.6906 12.5875 16.6906ZM3 19.4531C3 20.175 3.28677 20.8673 3.79722 21.3778C4.30767 21.8882 4.99999 22.175 5.72187 22.175C6.44376 22.175 7.13608 21.8882 7.64653 21.3778C8.15698 20.8673 8.44375 20.175 8.44375 19.4531V16.7312H5.7625C4.25938 16.6906 3 17.9094 3 19.4531ZM12.5875 3C11.8656 3 11.1733 3.28677 10.6628 3.79722C10.1524 4.30767 9.86562 4.99999 9.86562 5.72187C9.86562 6.44376 10.1524 7.13608 10.6628 7.64653C11.1733 8.15698 11.8656 8.44375 12.5875 8.44375H15.3094V5.72187C15.3094 4.21875 14.0906 3 12.5875 3ZM5.72187 15.3094H12.5469C13.2688 15.3094 13.9611 15.0226 14.4715 14.5122C14.982 14.0017 15.2688 13.3094 15.2688 12.5875C15.2688 11.8656 14.982 11.1733 14.4715 10.6628C13.9611 10.1524 13.2688 9.86562 12.5469 9.86562H5.72187C4.99999 9.86562 4.30767 10.1524 3.79722 10.6628C3.28677 11.1733 3 11.8656 3 12.5875C3 13.3094 3.28677 14.0017 3.79722 14.5122C4.30767 15.0226 4.99999 15.3094 5.72187 15.3094ZM26.2375 9.86562C24.7344 9.86562 23.5156 11.0844 23.5156 12.5875V15.3094H26.2375C26.9594 15.3094 27.6517 15.0226 28.1622 14.5122C28.6726 14.0017 28.9594 13.3094 28.9594 12.5875C28.9594 11.8656 28.6726 11.1733 28.1622 10.6628C27.6517 10.1524 26.9594 9.86562 26.2375 9.86562ZM16.6906 5.72187V12.5875C16.6906 13.3094 16.9774 14.0017 17.4878 14.5122C17.9983 15.0226 18.6906 15.3094 19.4125 15.3094C20.1344 15.3094 20.8267 15.0226 21.3372 14.5122C21.8476 14.0017 22.1344 13.3094 22.1344 12.5875V5.72187C22.1344 4.99999 21.8476 4.30767 21.3372 3.79722C20.8267 3.28677 20.1344 3 19.4125 3C18.6906 3 17.9983 3.28677 17.4878 3.79722C16.9774 4.30767 16.6906 4.99999 16.6906 5.72187ZM22.1344 26.2781C22.1344 24.775 20.9156 23.5562 19.4125 23.5562H16.6906V26.2781C16.6906 27 16.9774 27.6923 17.4878 28.2028C17.9983 28.7132 18.6906 29 19.4125 29C20.1344 29 20.8267 28.7132 21.3372 28.2028C21.8476 27.6923 22.1344 27 22.1344 26.2781ZM26.2781 16.6906H19.4125C18.6906 16.6906 17.9983 16.9774 17.4878 17.4878C16.9774 17.9983 16.6906 18.6906 16.6906 19.4125C16.6906 20.1344 16.9774 20.8267 17.4878 21.3372C17.9983 21.8476 18.6906 22.1344 19.4125 22.1344H26.2375C27.7406 22.1344 28.9594 20.9156 28.9594 19.4125C29 17.9094 27.7812 16.6906 26.2781 16.6906Z" fill=currentColor /></g><defs><clipPath id=clip0_125_278><rect width=26 height=26 fill=currentColor transform="translate(3 3)"/></clipPath></defs></svg></a></div><div class=social><a href=https://www.youtube.com/hashtag/apachedoris title=youtube target=_blank class=item><svg width=2em height=2em viewBox="0 0 32 32" fill=none><path d="M28.5167 7.83429C28.9436 8.25423 29.2532 8.77539 29.4154 9.34742C29.8205 11.5462 30.0159 13.7775 29.999 16.0121C30.0144 18.2382 29.819 20.4609 29.4154 22.6515C29.2532 23.2235 28.9436 23.7446 28.5167 24.1645C28.0898 24.5845 27.5601 24.889 26.9785 25.0486C24.7728 25.625 16.0124 25.625 16.0124 25.625C16.0124 25.625 7.22652 25.625 5.04638 25.0486C4.46489 24.889 3.9351 24.5845 3.5082 24.1645C3.08132 23.7446 2.77176 23.2235 2.60948 22.6515C2.19736 20.4617 1.9934 18.239 2.00025 16.0121C1.9918 13.7767 2.19577 11.5455 2.60948 9.34742C2.77176 8.77539 3.08132 8.25423 3.5082 7.83429C3.9351 7.41436 4.46489 7.10985 5.04638 6.95021C7.25103 6.36354 16.0124 6.37502 16.0124 6.37502C16.0124 6.37502 24.796 6.37502 26.9785 6.95021C27.5601 7.10985 28.0898 7.41436 28.5167 7.83429ZM12.5 21.25L21.25 16.008L12.5 10.75V21.25Z" fill=currentColor /></svg></a><a href=https://www.linkedin.com/company/doris-apache/ title=linkedin target=_blank class=item><svg width=2rem height=2rem viewBox="0 0 32 32" fill=none><path d="M4.29925 26.9996H9.66738V11.6781H4.29925V26.9996ZM22.1628 11.1949C19.9409 11.1949 18.7157 11.9388 17.3054 13.7407V11.6777H11.9459V26.9996H17.305V18.6738C17.305 16.9168 18.145 15.1982 20.1535 15.1982C22.162 15.1982 22.6559 16.9164 22.6559 18.632V27H28V18.2902C28 12.2386 24.3854 11.1949 22.1628 11.1949ZM6.99325 4C5.3395 4 4 5.21047 4 6.7046C4 8.19759 5.3395 9.40617 6.99325 9.40617C8.6455 9.40617 9.985 8.19722 9.985 6.7046C9.985 5.21047 8.6455 4 6.99325 4Z" fill=white /></svg></a><a href=https://medium.com/@ApacheDoris title=medium target=_blank class=item><svg width=2em height=2em viewBox="0 0 32 32" fill=none><g id=Frame><path id=Vector d="M17.7967 16.5385C17.8029 18.53 16.9746 20.4425 15.4937 21.8559C14.0128 23.2693 12.0004 24.0681 9.89836 24.0769C7.79633 24.0681 5.78391 23.2693 4.30302 21.8559C2.82212 20.4425 1.99383 18.53 2.00003 16.5385C1.99383 14.5469 2.82212 12.6344 4.30302 11.221C5.78391 9.80759 7.79633 9.00878 9.89836 9C12.0004 9.00878 14.0128 9.80759 15.4937 11.221C16.9746 12.6344 17.8029 14.5469 17.7967 16.5385ZM26.4533 16.5385C26.4533 20.4514 24.6917 23.6348 22.51 23.6348C20.3283 23.6348 18.555 20.4514 18.555 16.5385C18.555 12.6255 20.3283 9.44214 22.51 9.44214C24.6917 9.44214 26.4533 12.6255 26.4533 16.5385ZM30 16.5385C30 20.0424 29.3817 22.8942 28.6117 22.8942C27.8417 22.8942 27.2233 20.0424 27.2233 16.5385C27.2233 13.0345 27.8417 10.1827 28.6117 10.1827C29.3817 10.1827 30 13.0345 30 16.5385Z" fill=currentColor /></g></svg></a></div></div></div></div><div class=footer__copyright>Copyright © 2026 The Apache Software Foundation,Licensed under the <a href=https://www.apache.org/licenses/LICENSE-2.0 target=_blank>Apache License, Version 2.0</a>. Apache, Doris, Apache Doris, the Apache feather logo and the Apache Doris logo are trademarks of The Apache Software Foundation.</div></div></div></div> |