Apache Doris 是一款高性能、实时分析型数据库,支持MySQL协议,适合做大数据分析和实时查询。下面用最简单的语言,带你一步步了解Doris的基础知识和操作流程,并配上示例代码,帮助你快速理解和使用。
1. 环境准备与登录
- Doris使用MySQL协议,默认前端服务(FE)端口是9030。
- 使用MySQL客户端连接Doris:
mysql -h 127.0.0.1 -P 9030 -uroot
- 初次登录后,建议修改root密码:
set password for 'root' = PASSWORD('your_password');
2. 创建数据库和用户权限
- 创建数据库(需要管理员权限):
CREATE DATABASE example_db;
- 查看已有数据库:
SHOW DATABASES;
- 给用户授权操作权限:
GRANT ALL ON example_db TO test;
3. 创建表结构
Doris中数据存储在表里,表由行和列组成。表可以设置分区和分桶,帮助优化查询性能和存储效率。
3.1 简单表(单分区)示例
CREATE TABLE table1 (
siteid INT DEFAULT 10,
citycode SMALLINT,
username VARCHAR(32) DEFAULT '',
pv BIGINT SUM DEFAULT 0
)
AGGREGATE KEY(siteid, citycode, username)
DISTRIBUTED BY HASH(siteid) BUCKETS 10
PROPERTIES("replication_num" = "1");
AGGREGATE KEY
表示这是一个聚合表,pv字段会自动求和。DISTRIBUTED BY HASH(siteid) BUCKETS 10
表示根据siteid字段做哈希分桶,分成10个桶,数据均匀分布。replication_num=1
表示数据只有1份副本,生产环境建议设置为3保证安全。
3.2 带时间分区的表示例
CREATE TABLE table2 (
event_day DATE,
siteid INT DEFAULT 10,
citycode SMALLINT,
username VARCHAR(32) DEFAULT '',
pv BIGINT SUM DEFAULT 0
)
AGGREGATE KEY(event_day, siteid, citycode, username)
PARTITION BY RANGE(event_day) (
PARTITION p1 VALUES LESS THAN ('2017-06-30'),
PARTITION p2 VALUES LESS THAN ('2017-07-31'),
PARTITION p3 VALUES LESS THAN ('2017-08-31')
)
DISTRIBUTED BY HASH(siteid) BUCKETS 10
PROPERTIES("replication_num" = "1");
- 使用
PARTITION BY RANGE
按日期分区,方便管理和查询历史数据。 - 每个分区内部再做哈希分桶。
4. 数据导入方式
Doris支持多种导入数据的方法,常用的有:
4.1 Stream Load(快速导入小批量数据)
通过HTTP协议上传CSV文件,适合快速导入。
示例命令:
curl --location-trusted -u root:your_password \
-H "label:table1_20230518" \
-H "column_separator:," \
-T table1_data.csv \
http://fe_host:8030/api/example_db/table1/_stream_load
label
是导入任务的唯一标识,避免重复导入。column_separator
指定列分隔符。
4.2 Insert语句导入
直接用SQL插入数据,适合少量数据或从其他表导入。
INSERT INTO table1 VALUES (1, 1, 'user1', 10);
或者从另一张表导入:
INSERT INTO table1 SELECT * FROM table2 WHERE event_day = '2017-07-01';
4.3 Broker Load(批量导入大数据)
适合从HDFS或对象存储批量导入Parquet、ORC等格式数据,适合海量数据加载。
5. 查询示例
Doris支持标准SQL查询,示例:
SELECT username, SUM(pv) AS total_pv
FROM table1
GROUP BY username
ORDER BY total_pv DESC
LIMIT 10;
该语句查询每个用户的pv总和,并按总pv降序取前10名。
6. 关键概念补充
- 分区(Partition) :将数据按某个字段(如日期)划分成多个部分,方便管理和查询。
- 分桶(Bucket) :在分区内部根据某个字段做哈希分桶,帮助数据均匀分布,提高查询效率。
- Tablet:Doris中存储数据的最小物理单元,一个Tablet对应一个分桶。
- 副本数(replication_num) :数据的备份数量,默认1,生产环境建议设置为3,保证数据安全。
- AGGREGATE KEY表:支持对某些列自动聚合(如sum),适合统计类场景。
7. 分桶数量建议
合理设置分桶数量能提升性能,以下是参考建议:
表大小 | 建议分桶数量 |
---|---|
500MB | 4-8 |
5GB | 6-16 |
50GB | 32 |
500GB | 分区,每分区50GB,每分区16-32个分桶 |
5TB | 分区,每分区50GB,每分区16-32个分桶 |
每个Tablet大小建议控制在1-10GB之间,过小会增加管理开销,过大影响性能。
8. 完整示例:创建数据库、表,导入数据,查询
-- 创建数据库
CREATE DATABASE test_db;
-- 使用数据库
USE test_db;
-- 创建表
CREATE TABLE user_pv (
user_id INT,
username VARCHAR(32),
pv BIGINT SUM DEFAULT 0
)
AGGREGATE KEY(user_id, username)
DISTRIBUTED BY HASH(user_id) BUCKETS 8
PROPERTIES("replication_num" = "3");
-- 插入数据
INSERT INTO user_pv VALUES (1, '张三', 100);
INSERT INTO user_pv VALUES (2, '李四', 150);
-- 查询数据
SELECT username, SUM(pv) AS total_pv
FROM user_pv
GROUP BY username
ORDER BY total_pv DESC;
通过以上步骤,你可以快速搭建Apache Doris环境,创建数据库和表,导入数据,并执行高效的SQL查询。Doris支持高并发、实时分析,适合构建实时数仓和大数据分析平台。
如果想了解更多细节和高级功能,可以参考官方文档和社区资源。祝你使用顺利!