Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,151 @@
---
title: CREATE AGGREGATE FUNCTION
sidebar_position: 1
---
import FunctionDescription from '@site/src/components/FunctionDescription';

<FunctionDescription description="引入或更新于:v1.2.799"/>

创建用户自定义聚合函数(UDAF),在 Databend 内置的 JavaScript 或 Python 运行时中执行。

### 支持的语言

- `javascript`
- `python`

## 语法

```sql
CREATE [ OR REPLACE ] FUNCTION [ IF NOT EXISTS ] <function_name>
( [ <parameter_list> ] )
STATE { <state_field_list> }
RETURNS <return_type>
LANGUAGE <language_name>
[ IMPORTS = (<stage_files>) ]
[ PACKAGES = (<python_packages>) ]
AS $$
<language_specific_code>
$$
[ DESC='<description>' ]
```

| 参数 | 说明 |
| --- | --- |
| `<function_name>` | 聚合函数名称。 |
| `<parameter_list>` | 可选的输入参数及其类型,例如 `value DOUBLE`。 |
| `STATE { <state_field_list> }` | 定义聚合过程中需要在部分聚合和最终聚合步骤间持久化的状态结构(例如 `STATE { sum DOUBLE, count DOUBLE }`)。 |
| `<return_type>` | 聚合返回的数据类型。 |
| `LANGUAGE` | 运行脚本的语言,支持 `javascript`、`python`。 |
| `IMPORTS` / `PACKAGES` | 可选列表,用于加载额外文件(imports)或 PyPI 包(仅限 Python)。 |
| `<language_specific_code>` | 脚本主体,必须实现并暴露 `create_state`、`accumulate`、`merge` 和 `finish` 入口函数。 |
| `DESC` | 可选描述。 |

脚本需要实现以下函数:

- `create_state()` – 分配并返回初始状态对象。
- `accumulate(state, *args)` – 针对每个输入行更新状态。
- `merge(state1, state2)` – 合并两个部分聚合状态。
- `finish(state)` – 生成最终结果(返回 `None` 表示 SQL `NULL`)。

## 访问控制要求

| 权限 | 对象类型 | 描述 |
|:-----|:---------|:-----|
| SUPER | 全局、表 | 操作 UDF |

创建 UDF 的用户或其 [current_role](/guides/security/access-control/roles) 必须拥有 SUPER [权限](/guides/security/access-control/privileges)。

## 示例

### Python 平均值 UDAF

以下 Python 聚合函数示例用于计算列的平均值:

```sql
CREATE OR REPLACE FUNCTION py_avg (value DOUBLE)
STATE { sum DOUBLE, count DOUBLE }
RETURNS DOUBLE
LANGUAGE python
AS $$
class State:
def __init__(self):
self.sum = 0.0
self.count = 0.0

def create_state():
return State()

def accumulate(state, value):
if value is not None:
state.sum += value
state.count += 1
return state

def merge(state1, state2):
state1.sum += state2.sum
state1.count += state2.count
return state1

def finish(state):
if state.count == 0:
return None
return state.sum / state.count
$$;

SELECT py_avg(number) AS avg_val FROM numbers(5);
```

```
+---------+
| avg_val |
+---------+
| 2 |
+---------+
```

### JavaScript 平均值 UDAF

下面示例演示如何使用 JavaScript 完成相同的平均值计算:

```sql
CREATE OR REPLACE FUNCTION js_avg (value DOUBLE)
STATE { sum DOUBLE, count DOUBLE }
RETURNS DOUBLE
LANGUAGE javascript
AS $$
export function create_state() {
return { sum: 0, count: 0 };
}

export function accumulate(state, value) {
if (value !== null) {
state.sum += value;
state.count += 1;
}
return state;
}

export function merge(state1, state2) {
state1.sum += state2.sum;
state1.count += state2.count;
return state1;
}

export function finish(state) {
if (state.count === 0) {
return null;
}
return state.sum / state.count;
}
$$;

SELECT js_avg(number) AS avg_val FROM numbers(5);
```

```
+---------+
| avg_val |
+---------+
| 2 |
+---------+
```
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
---
title: CREATE EMBEDDED FUNCTION
sidebar_position: 2
sidebar_position: 3
---
import FunctionDescription from '@site/src/components/FunctionDescription';

Expand Down Expand Up @@ -207,4 +207,4 @@ AS $$@s_udf/arrow_udf_example.wasm$$;

-- 使用函数
SELECT fib_wasm(10) AS fibonacci_result;
```
```
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@ import FunctionDescription from '@site/src/components/FunctionDescription';

<FunctionDescription description="引入或更新于:v1.2.799"/>

使用 Databend 的统一函数语法创建标量 SQL UDF(User-Defined Function)。
使用 Databend 的统一函数语法创建标量 SQL UDF。其逻辑完全由 SQL 定义,无需外部编程语言支持。

### 支持语言

- 仅支持 SQL 表达式(无需外部运行时环境)

## 语法

Expand Down Expand Up @@ -59,4 +63,4 @@ $$;
SELECT area_of_circle(5.0) AS circle_area;
SELECT calculate_age('1990-05-15') AS age;
SELECT calculate_bmi(70.0, 1.75) AS bmi;
```
```
Original file line number Diff line number Diff line change
@@ -1,12 +1,16 @@
---
title: CREATE TABLE FUNCTION
sidebar_position: 1
sidebar_position: 2
---
import FunctionDescription from '@site/src/components/FunctionDescription';

<FunctionDescription description="引入或更新于:v1.2.799"/>

创建表格式 SQL UDF(UDTF),将 SQL 查询封装为表函数。为保持一致性,使用与标量函数相同的统一 `$$` 语法。当前仅支持基于 SQL 的表函数。
创建表值 SQL UDF (UDTF),将 SQL 查询封装为表函数。此类函数完全使用 SQL 编写,不涉及外部编程语言。

### 支持语言

- 仅支持 SQL 查询(无需外部运行时环境)

## 语法

Expand Down Expand Up @@ -83,4 +87,4 @@ AS $$ SELECT department, COUNT(*) as employee_count, AVG(salary) as avg_salary F

-- 使用复杂表函数
SELECT * FROM get_department_stats();
```
```
33 changes: 17 additions & 16 deletions docs/cn/sql-reference/10-sql-commands/00-ddl/10-udf/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,30 +2,31 @@
title: 用户自定义函数
---

Databend 中的用户自定义函数(User-Defined Function,UDF)允许您根据特定的数据处理需求创建自定义操作。本页面将帮助您为具体用例选择合适的函数类型。

## 函数类型对比

| 特性 | 标量 SQL(Scalar SQL) | 表格 SQL(Tabular SQL) | 嵌入式(Embedded) |
|---|---|---|---|
| **返回类型** | 单个值 | 表/结果集 | 单个值 |
| **语言** | SQL 表达式 | SQL 查询 | Python/JavaScript/WASM |
| **性能** | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| **需要企业版** | 否 | 否 | Python:是 |
| **包支持** | 否 | 否 | Python:是 |
| **最佳适用场景** | 数学计算<br/>字符串操作<br/>数据格式化 | 复杂查询<br/>多行结果<br/>数据转换 | 高级算法<br/>外部库<br/>控制流逻辑 |
Databend 中的用户自定义函数(User-Defined Function,UDF)允许您根据特定的数据处理需求创建自定义操作。本页将重点介绍常用命令,并帮助您选择适合您用例的函数类型。

## 函数管理命令

| 命令 | 描述 |
|---|---|
| [CREATE SCALAR FUNCTION](ddl-create-function.md) | 使用统一语法创建标量 SQL 函数 |
| [CREATE TABLE FUNCTION](ddl-create-table-function.md) | 创建返回结果集的表格函数 |
| [CREATE EMBEDDED FUNCTION](ddl-create-function-embedded.md) | 创建嵌入式函数(Python/JavaScript/WASM) |
| [CREATE SCALAR FUNCTION](ddl-create-function.md) | 纯 SQL 标量函数(无外部语言) |
| [CREATE AGGREGATE FUNCTION](ddl-create-aggregate-function.md) | 脚本 UDAF(JavaScript/Python 运行时) |
| [CREATE TABLE FUNCTION](ddl-create-table-function.md) | 纯 SQL 表函数(返回结果集) |
| [CREATE EMBEDDED FUNCTION](ddl-create-function-embedded.md) | 嵌入式函数(Python/JavaScript/WASM) |
| [SHOW USER FUNCTIONS](ddl-show-user-functions.md) | 列出所有用户自定义函数 |
| [ALTER FUNCTION](ddl-alter-function.md) | 修改现有函数 |
| [DROP FUNCTION](ddl-drop-function.md) | 移除函数 |

## 函数类型对比

| 特性 | 标量 SQL(Scalar) | 聚合(脚本) | 表格 SQL(Tabular) | 嵌入式(Embedded) |
|---|---|---|---|---|
| **返回类型** | 单个值 | 单个值 | 表/结果集 | 单个值 |
| **语言** | SQL 表达式 | JavaScript/Python 运行时 | SQL 查询 | Python/JavaScript/WASM |
| **性能** | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ |
| **需要企业版** | 否 | Python 运行时需要 | 否 | Python 运行时需要 |
| **包支持** | 否 | Python:支持 PACKAGES | 否 | Python:支持 PACKAGES |
| **最佳适用场景** | 数学计算<br/>字符串操作<br/>数据格式化 | 自定义聚合逻辑<br/>需要脚本语言处理 | 复杂查询<br/>多行结果<br/>数据转换 | 高级算法<br/>外部库<br/>控制流逻辑 |

## 统一语法

所有本地 UDF 类型都使用一致的 `$$` 语法:
Expand All @@ -40,4 +41,4 @@ CREATE FUNCTION func_name(param TYPE) RETURNS TABLE(...) AS $$ query $$;
-- 嵌入式函数
CREATE FUNCTION func_name(param TYPE) RETURNS TYPE LANGUAGE python
HANDLER = 'handler' AS $$ code $$;
```
```
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,11 @@ import FunctionDescription from '@site/src/components/FunctionDescription';

<FunctionDescription description="引入或更新于:v1.2.339"/>

创建外部函数(External Function)。
创建外部函数(External Function),通过 Flight 协议调用远程处理程序(通常为 Python 或其他服务)。

### 支持语言

- 由远程服务器实现决定(常见为 Python,只要实现了 Flight 接口,可以使用任意语言)

## 语法

Expand Down Expand Up @@ -39,4 +43,4 @@ CREATE FUNCTION gcd AS (INT, INT)
LANGUAGE python
HANDLER = 'gcd'
ADDRESS = 'http://localhost:8815';
```
```
Loading
Loading