---
# System prepended metadata

title: Databend 开源周报第 84 期
tags: [weekly]

---

---
title: Databend 开源周报第 84 期
description: 
slug:  databend-weekly-84
date: 2023-03-13
tags: [weekly]
cover_url: databend-weekly.svg
image: databend-weekly.png
authors:
- datafuselabs
---

# Databend 开源周报 第 84 期

![databend weekly](https://i.imgur.com/DqRbPYS.png)

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

## What's On In Databend

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

### SQL: `REPLACE INTO`

Databend 现在支持使用 `REPLACE INTO` 语句插入或更新数据。该语句允许你指定一个冲突键（`conflict key`），用于判断是应该插入一行新数据，还是更新一行已有数据。

如果表中已经存在与冲突键相同的行，Databend 会用新数据更新这一行。否则，新数据会作为一行新记录添加到表中。你可以使用这个语句来轻松地同步不同来源的数据或处理重复记录。

```sql
#> CREATE TABLE employees(id INT, name VARCHAR, salary INT);
#> REPLACE INTO employees (id, name, salary) ON (id) VALUES (1, 'John Doe', 50000);
#> SELECT  * FROM Employees;
+------+----------+--------+
| id   | name     | salary |
+------+----------+--------+
|    1 | John Doe |  50000 |
+------+----------+--------+
```

如果你想要了解关于 `REPLACE INTO` 语句的更多细节，可以参阅下方列出的材料：

- [Docs | DML Commands - REPLACE](https://databend.rs/doc/sql-commands/dml/dml-replace)
- [PR | feat: replace into statement](https://github.com/datafuselabs/databend/pull/10191)

### RFCs: Transform with Copy Into

Databend 目前可以将 Stage 中的数据转换并插入到表中。例如，你可以运行这样的SQL语句：

```sql
insert into table1 from (select c1， c2 from @stage1/path/to/dir);
```

`COPY INTO` 语句也需要实现类似功能，以支持从 Stage 增量载入数据。

如果你对这个特性感兴趣，可以阅读下面列出的两篇 RFC：

- [Docs | RFCs - Transform During Load](https://databend.rs/doc/contributing/rfcs/transform-during-load)
- [Docs | RFCs - Stage With Schema](https://databend.rs/doc/contributing/rfcs/stage-with-schema)

## Code Corner

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


### Rust Toolchain: 🦀 v1.70.0-nightly (03-10)

Databend 的工具链已经升级至 `nightly-2023-03-10` ，在拉取最新的代码后别忘记运行 `cargo clean` 清理哦。

在更新过程中我们修复了一些 clippy 警告。现在代码中使用 `#[default]` 来标注 `enum` 中的默认值，示例如下：

```rust
#[derive(Debug, Default)]
pub enum RecordDelimiter {
    #[default]
    Crlf,
    Any(u8),
}
```

如果你对这一 Rust 技巧感兴趣，可以参阅这个 RFC: [`derive_default_enum`](https://rust-lang.github.io/rfcs/3107-derive-default-enum.html).

### Announcing OpenDAL v0.30

[OpenDAL](https://github.com/datafuselabs/opendal) 在最近发布的 0.30 中带来了一些重要的新特性，包括移除 `Object` 抽象和提供对 JavaScript 与 Python 语言的绑定。

**Removing `Object` Abstraction**

在很多领域都有用到术语 `Object` ，很难为 `opendal::Object` 提供一个简洁的定义。现在，OpenDAL 消除了 `Object` 的中间 API，所以用户可以直接使用 `Operator` 操作数据，例如：

```diff
# get metadata of a path
- op.object("path").stat().await;
+ op.stat("path").await;
```

**Bindings for JavaScript and Python**

OpenDAL 也在同一时间发布了适用于 JavaScript 和 Python 的绑定，感谢 [@suyanhanx](https://github.com/suyanhanx), [@messense](https://github.com/messense), [@Xuanwo](https://github.com/Xuanwo), 和其他参与的贡献者。现在，使用这两种语言的用户可以使用 OpenDAL 来访问来自不同服务的数据。我们希望数据科学家和数据分析师能够从中获益，使用 OpenDAL 可以节省掉学习其他 SDK 的成本。

下面是一段 Python 示例：

```python
>>> import opendal
>>> op = opendal.Operator('memory')
>>> op.write("test", b"Hello, World!")
>>> op.read("test")
b'Hello, World!'
```

## What's Up Next

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

### Support More Mathematical Operators like PostgreSQL

为了支持在 SQL 中执行复杂的数学运算，Databend 计划支持更多的数学运算符，这里主要参考 PostgreSQL 的设计。以帮助用户减少对其他语言或额外工具的依赖。

| Operator | Description         | Example    | Result |
| -------- | ------------------- | ---------- | ------ |
| ^        | exponentiation      | 2.0 ^ 3.0  | 8      |
| \|/      | square root         | \|/ 25.0   | 5      |
| \|\|/    | cube root           | \|\|/ 27.0 | 3      |
| !        | factorial           | 5 !        | 120    |
| @        | absolute value      | @ -5.0     | 5      |
| &        | bitwise AND         | 91 & 15    | 11     |
| \|       | bitwise OR          | 32 \| 3    | 35     |
| #        | bitwise XOR         | 17 # 5     | 20     |
| ~        | bitwise NOT         | ~1         | -2     |
| <<       | bitwise shift left  | 1 << 4     | 16     |
| >>       | bitwise shift right | 8 >> 2     | 2      |

[@jun0315](https://github.com/jun0315) 目前正在致力于解决这一问题，如果你对如何实现这些运算感兴趣，不妨关注一下。

[Issue 10233: Feature: support more pg functions](https://github.com/datafuselabs/databend/issues/10233)

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

## New Contributors

一起认识社区中的新伙伴，Databend 因你们而变得更加美好

- [@jun0315](https://github.com/jun0315) 实现了 `caret` 运算符来支持幂运算，例如 2^3 表示 2 的 3 次方，等于 8，[#10347](https://github.com/datafuselabs/databend/pull/10347)
- [@quaxquax](https://github.com/quaxquax) 帮忙修复了 typo，[#10465](https://github.com/datafuselabs/databend/pull/10465)

## Changelog

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

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

## Contributors

非常感谢贡献者们在本周的卓越工作。

![](https://i.imgur.com/vYB7ujS.png)

## Connect With Us

Databend 是一款开源、弹性、低成本，基于对象存储也可以做实时分析的新式数仓。期待您的关注，一起探索云原生数仓解决方案，打造新一代开源 Data Cloud。

- [Databend Website](https://databend.rs) 
- [GitHub Discussions](https://github.com/datafuselabs/databend/discussions)
- [Twitter](https://twitter.com/Datafuse_Labs)
- [Slack Channel](https://link.databend.rs/join-slack)