Skip to main content

CREATE DICTIONARY

Introduced or updated: v1.2.636

创建一个字典,支持从外部源实时访问数据。字典允许 Databend 直接从 MySQL 和 Redis 等外部系统查询数据,而无需传统的 ETL 流程,从而确保数据一致性并提高查询性能。

语法

CREATE [ OR REPLACE ] DICTIONARY [ IF NOT EXISTS ] <dictionary_name>
(
<column_name1> <data_type1> [ DEFAULT <default-value-1> ],
<column_name2> <data_type2> [ DEFAULT <default-value-2> ],
...
)
PRIMARY KEY <primary_key_column>
SOURCE(<source_type>(<source_parameters>))

创建字典时,Databend 会建立与指定外部数据源的连接。然后可以使用 dict_get() 函数查询字典,以在查询时直接从源检索数据。

参数描述
<dictionary_name>字典的名称,在查询中被引用。
<column_name>字典中列的名称。这些列定义了可以从外部源检索的数据的结构。
<data_type>每列的数据类型。对于 MySQL 源,Databend 支持 boolean、string 和 numeric 类型(包括 int、bigint、float32、float64)。对于 Redis 源,仅支持 string 类型。
<default-value>当在外部源中找不到值时,列的可选默认值。这确保了即使缺少数据,查询也能返回有意义的结果。
<primary_key_column>查询字典时用作查找键的列。这应对应于外部数据源中的唯一标识符。
<source_type>外部数据源的类型。当前支持:MYSQLREDIS。未来版本将支持其他源。
<source_parameters>特定于所选源类型的连接和配置参数。

MySQL 参数

下表列出了配置 MySQL 数据源所需的和可选的参数:

参数是否必需?描述
hostMySQL 服务器的 IP 地址或主机名。
portMySQL 服务器正在侦听的端口。
username用于连接到 MySQL 服务器的用户名。
password与用户名关联的用于访问 MySQL 服务器的密码。
db要从中提取数据的 MySQL 服务器上的数据库的名称。
table数据库中数据所在的表的名称。

Redis 参数

下表列出了配置 Redis 数据源所需的和可选的参数:

参数是否必需?描述
hostRedis 服务器的主机名或 IP 地址。
portRedis 服务器的端口号。
username如果 Redis 服务器需要用户身份验证,则为用户名。
password用于用户身份验证的密码。
db_index指定 Redis 数据库索引,默认为 0。索引范围为 0 到 15,因为 Redis 支持 16 个从 0 到 15 索引的数据库。

示例

MySQL 字典示例

以下示例使用来自 MySQL 数据库的数据创建一个名为 courses_dict 的字典:

CREATE DICTIONARY courses_dict
(
course_id INT,
course_name STRING
)
PRIMARY KEY course_id
SOURCE(MYSQL(
host='localhost'
port='3306'
username='root'
password='123456'
db='test'
table='courses'
));

Redis 字典示例

以下示例使用来自 Redis 数据源的数据创建一个名为 student_name_dict 的字典:

CREATE DICTIONARY student_name_dict
(
student_id STRING,
student_name STRING
)
PRIMARY KEY student_id
SOURCE(REDIS(
host='127.0.0.1'
port='6379'
));

与 dict_get() 一起使用

创建字典后,可以使用 dict_get() 函数查询它:

-- 使用字典查询学生信息
SELECT
student_id,
dict_get(student_name_dict, 'student_name', to_string(student_id)) as student_name,
course_id,
dict_get(courses_dict, 'course_name', course_id) as course_name
FROM student_scores;

这种方法支持跨多个源的实时数据集成,而无需复杂的 ETL 流程。

Explore Databend Cloud for FREE
Low-cost
Fast Analytics
Easy Data Ingestion
Elastic Scaling
Try it today