---
title: Databend 开源周报第 112 期
description: '了解如何使用用户自定义函数。此外，Databend 最近使用 Prometheus 替换 metrics-rs 以改善可观测性。'
slug: category-weekly/databend-weekly-112
date: 2023-09-25
tags: [weekly]
category: Weekly
cover_url: 'weekly/weekly-112.jpg'
image: 'weekly/weekly-112.jpg'
contributors:
  - name: akoshchiy
  - name: andylokandy
  - name: ariesdevil
  - name: b41sh
  - name: BohuTang
  - name: dantengsky
  - name: Dousir9
  - name: drmingdrmer
  - name: flaneur2020
  - name: gitccl
  - name: JackTan25
  - name: leiysky
  - name: PsiACE
  - name: RinChanNOWWW
  - name: soyeric128
  - name: sundy-li
  - name: TCeason
  - name: xudong963
  - name: youngsofun
  - name: zhang2014
  - name: zhyass
authors:
  - DatabendLabs
---

> 英文版移步：https://www.databend.com/blog/2023-09-24-databend-weekly
>
> [Databend](https://github.com/databendlabs/databend) 是一款现代云数仓。专为弹性和高效设计，为您的大规模分析需求保驾护航。自由且开源。即刻体验云服务：[https://app.databend.cn](https://app.databend.cn) 。

## What's On In Databend

探索 Databend 本周新进展，遇到更贴近你心意的 Databend。

### 理解用户自定义函数（UDF）

用户自定义函数（User-Defined Function，UDF）允许你的自定义操作与 Databend 进行集成，从而更好地处理数据、执行任务，构造更合理的数据工作流。

Databend 目前支持两种形式的用户自定义函数：使用 SQL lambda 表达式编写或者用 Python 等编程语言实现 UDF 服务器注册。用户自定义函数可以作为 Databend 查询处理流程的一部分执行。

使用 UDFs 的优点包括：

- 自定义数据转换。
- 优化性能。
- 改善代码可重用性。

如果您想了解更多信息，请查看下面列出的资源。

- [Docs | User-Defined Function](https://docs.databend.cn/sql/sql-commands/ddl/udf)

{/* truncate */}

## Code Corner

一起来探索 Databend 和周边生态中的代码片段或项目。

### 使用 Prometheus 改善可观测性

metrics-rs 为不同的可观测性方案构建了一个通用的抽象层，支持包括 statsd、prometheus、new-relic 等在内的多种工具，但是 metrics-rs 无法很好地支持直方图统计之类的度量。

如今，Prometheus 已成为可观测性领域的事实标准，使用原始的 Prometheus 客户端，而不是将指标推送给其他工具，会带来一些显而易见的好处：

- 更好的性能：经过良好实现的观测指标的内存分配应该是 O(1) ，无需本地缓冲队列。
- 减少抽象层：我们可以减少关于指标的抽象层，使代码路径更易于理解。
- 更好的编码规范：目前我们在不同模块中有不同的度量标准实践，可以学习 Prometheus 社区的度量标准实践来统一我们的度量标准实践。

现在，Databend 的可观测性指标已经完全迁移到 Prometheus 实现，在保持原有指标几乎不变的情况下，带来了更全面、更可靠的可观测性体验。

如果您想了解更多信息，请查看下面列出的资源。

- [PR #12787 | feat(observability): replace metrics-rs with prometheus-client](https://github.com/databendlabs/databend/pull/12787)
- [Issue #12635 | Tracking: replace metrics-rs with prometheus-client-rs](https://github.com/databendlabs/databend/issues/12635)
- [Issue #9422 | Feature: Refactoring Databend Metrics Component with Prometheus](https://github.com/databendlabs/databend/issues/9422)

## Highlights

以下是一些值得注意的事件，也许您可以找到感兴趣的内容。

- `COMPACT` 支持分布式执行。
- 新增 `json_path_exists` 函数。
- 新增 `recluster_block_size` 设置用于控制重聚类时的块大小。
- 支持 `DECIMAL` 类型向 `INT` 类型的转换。
- 支持 inverted filter 以减少 filter 执行，部分场景下 4 倍性能提升。
- SQLSmith 测试支持生成表函数、窗口函数、子查询和 `WITH` 子句。

## What's Up Next

我们始终对前沿技术和创新理念持开放态度，欢迎您加入社区，为 Databend 注入活力。

### 实现 GREATEST 函数

GREATEST 函数的输入是一个表达式列表，输出是该表达式列表中的最大值。

**语法：**

```SQL
GREATEST( <expr1> [ , <expr2> ... ] )
```

**示例：**

```SQL
SELECT id, name, category, price, rating,
       CASE
         WHEN rating = 1 THEN 0.02
         WHEN rating = 2 THEN 0.04
         WHEN rating = 3 THEN 0.06
         WHEN rating = 4 THEN 0.08
         ELSE 0.1
       END AS increase_percentage_based_on_rating,
       rank() OVER (PARTITION BY category ORDER BY rating) AS rating_rank,
       CASE
         WHEN rating_rank = 1 THEN 0.2
         WHEN rating_rank = 2 THEN 0.1
         ELSE 0
       END AS increase_percentage_based_on_rank,
       GREATEST(increase_percentage_based_on_rating,
                increase_percentage_based_on_rank) AS final_increase_percentage,
       CAST(price * (1 + final_increase_percentage) AS DECIMAL(10, 2))
         AS adjusted_price
FROM products
```

[Issue #12944 | feat: GREATEST function](https://github.com/databendlabs/databend/issues/12944)

如果你对这个主题感兴趣，可以尝试解决其中的部分问题或者参与讨论和 PR review。或者，你可以点击 https://link.databend.com/i-m-feeling-lucky 来挑选一个随机问题，祝好运！

## Changelog

前往查看 Databend 每日构建的变更日志，以了解开发的最新动态。

地址：https://github.com/databendlabs/databend/releases
