Doris画像存储实践系列二

部署运行你感兴趣的模型镜像

上一篇:
Doris画像存储系列一(https://editor.youkuaiyun.com/md/?articleId=120416295)

六、画像宽表+bitmap倒排表

重复一下bitmap倒排表的优点和缺点
标签类型标签值user_ids
性别1,2
性别3
优点:
  1. doris bitmap聚合表在对做用户画像群体计算时很友好,交集/并集/差集
  2. 因为数据是聚合存储,因此数据量少,性能也特别好
缺点:
  1. 当我希望分页查询用户画像/自定义画像字段排序时特别麻烦
  2. 当我希望做流式计算做实时标签时,无法按照单个用户进行标签的删改
因此目前又有了一个新的技术方案:

“画像宽表” + bitmap倒排表方案,在方案五的时候使用的是"画像窄表"+bitmap倒排表方案,因为早期Doris只能支持整行更新,而无法实现某表某列的单独操作,现在呢已经可以实现了,具体方案如下:

通过doris聚合模型+REPLACE_IF_NOT_NULL 聚合函数实现

表创建结构如下
CREATE TABLE `tdm_user_tag` (
  `user_id` int(11) NULL COMMENT '用户ID',
  `sex` varchar(20) REPLACE_IF_NOT_NULL NULL COMMENT '性别',
  `age` varchar(20) REPLACE_IF_NOT_NULL NULL COMMENT '年龄段',
  `id_number` int(11) REPLACE_IF_NOT_NULL NULL COMMENT '身份证号'
) ENGINE = OLAP AGGREGATE KEY(`user_id`) COMMENT '用户标签表' DISTRIBUTED BY HASH(`month`) BUCKETS 8 PROPERTIES (
  "replication_allocation" = "tag.location.default: 3",
  "in_memory" = "false",
  "storage_format" = "V2",
  "disable_auto_compaction" = "false"
);
标签数据操作如下:
insert into tdm_user_tag(user_id,sex)values("1","男")("2","女");
insert into tdm_user_tag(user_id,age)values("1","90后");
insert into tdm_user_tag(user_id,id_number)values("1","1111111");
insert into tdm_user_tag(user_id,likes)values("1","钓鱼,看戏");

数据结果如下:
idsexageid_numberlikes
190后1111111钓鱼,看戏
2
说明:
  1. REPLACE_IF_NOT_NULL聚合函数,能够实现插入时忽略空值,也就可以实现一次操作某一列数据,也因为每个画像值的计算逻辑是不同的,所以也就和上面的例子一样,一条SQL对应一个画像,一个画像对应一个计算逻辑,一次操作一列数据
  2. 基于这样的宽表数据,实现排序,分页,自定义组合检索都是非常好的
  3. 同时也兼顾了类似于身份证号类别不适合定义为标签的字段
  4. 补充一点说明,有的画像是多值的,在上面的例子中使用逗号分隔多个标签值,Doris提供函数find_in_set函数,能够匹配出是否包含某个画像值,如:
-- 查看命中"看戏"爱好的人有哪些
select * from tdm_user_tag where find_in_set("看戏",likes) > 0
  1. 到目前为止,doris依然对单条插入不友好和推荐,上面只是例子表示可以实现某一例的操作,正常应该是批量操作的,如:
-- 通过用户表的信息生成画像信息
insert into tdm_user_tag(user_id,sex) select user_id,sex from user_info
  1. 一般数据量不大的情况下,只需要"画像宽表"就可以了,如果涉及大量的如画像群体的交并集查询等操作,此时再建立"bitmap倒排表"不迟,定时将"画像宽表"数据写入到"bitmap倒排表"

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

<think>我们正在处理关于Doris数据库模型的查询。用户要求了解Doris模型介绍及使用指南。根据提供的引用,特别是引用[2],我们可以提取关于Doris数据模型的关键信息。引用[2]详细描述了Doris的三种数据模型:Duplicate、Aggregate和Unique模型,以及它们的适用场景和高级技巧。此外,引用[3]提供了关于索引的信息,这对于优化查询性能很重要。我们将组织回答如下: 1.介绍Doris的三种数据模型及其特点。 2.说明每种模型的适用场景(根据引用[2]中的选型建议)。 3.提供一些高级技巧和最佳实践(如分区、分桶、索引等)。4.简要提及底层原理(存储结构和更新机制)以加深理解。注意:回答中需要遵循系统级指令,包括数学表达式的格式和引用标识的添加。由于用户问题中引用了三个引用,我们在回答中会自然地引用它们。 最后,生成相关问题。</think>### Doris数据模型介绍及使用指南 #### 一、核心数据模型 Doris提供三种数据模型,满足不同业务场景需求: 1. **Duplicate模型** - **特点**:存储原始明细数据,不进行任何聚合 - **适用场景**:用户行为日志、设备传感器数据、应用性能监控等需要完整原始数据的场景[^2] - **示例建表语句**: ```sql CREATE TABLE log_data ( ts DATETIME, device_id INT, event_type VARCHAR(32), log_content TEXT ) DUPLICATE KEY(ts, device_id) ``` 2. **Aggregate模型** - **特点**:自动聚合相同维度的指标数据 - **实现原理**:通过"合并聚合"(Merge-Aggregate)过程处理数据[^2] - 导入阶段内存预聚合 - 后台定期合并小文件 - 查询时执行最终聚合 - **适用场景**:网站访问统计、销售报表、运营指标监控等汇总分析场景[^2] - **示例建表语句**: ```sql CREATE TABLE sales_agg ( region VARCHAR(50), product_id BIGINT, sale_date DATE, total_sales INT SUM, max_price DOUBLE MAX ) AGGREGATE KEY(region, product_id, sale_date) ``` 3. **Unique模型** - **特点**:保证主键唯一性,实现主键更新 - **更新机制**:采用"标记-删除+插入"方式[^2] - 新数据标记旧数据为删除状态 - 插入新版本数据 - 查询时自动过滤删除标记 - **适用场景**:用户资料、商品信息、订单主数据等需要唯一主键的业务实体[^2] - **示例建表语句**: ```sql CREATE TABLE user_profile ( user_id BIGINT, name VARCHAR(50), last_login DATETIME, vip_level INT ) UNIQUE KEY(user_id) ``` #### 、底层存储原理 1. **列式存储结构** - 数据按列压缩存储,提升查询效率 - 存储层级:表(Table)→分区(Partition)→分片(Tablet)→段(Segment)→列(Column)→页(Page)[^2] 2. **分区与分桶优化** - 分区策略:按时间或业务键划分(如`PARTITION BY RANGE(sale_date)`) - 分桶策略:按高查询频率列分桶(如`DISTRIBUTED BY HASH(product_id)`) #### 三、性能优化实践 1. **索引策略** - **前缀索引**:基于排序键快速定位数据 - **倒排索引**:加速全文检索 - **BloomFilter索引**:优化等值查询效率 - **ZoneMap索引**:利用统计信息跳过无关数据块[^3] 2. **混合模型使用** ```mermaid graph LR A[原始日志] -->|Duplicate模型| B[原始数据层] B -->|ETL处理| C[Aggregate模型] C -->|聚合数据| D[汇总指标层] B -->|维度提取| E[Unique模型] E -->|用户画像| F[维度数据层] ``` 3. **生命周期管理** - 设置TTL自动过期数据(如`PROPERTIES ("storage_cooldown_time" = "2025-01-01")`) - 冷热数据分层存储 #### 四、使用指南 1. **登录集群**: ```bash mysql -h FE_HOST -P9030 -uroot ``` 内置root/admin用户,默认密码为空[^1] 2. **模型选型决策流程**: ```mermaid graph TD A[数据是否有唯一主键?] -->|是| B[选择Unique模型] A -->|否| C[需要保留原始明细?] C -->|是| D[选择Duplicate模型] C -->|否| E[选择Aggregate模型] ``` 3. **查询优化建议**: - 对高频过滤条件创建索引 - 使用`EXPLAIN`分析查询执行计划 - 通过`SHOW PROFILE`验证索引生效情况[^3] > **性能警示**:不合理的模型选择可能导致存储膨胀和查询劣化。例如在日志场景使用Unique模型,可能使数据量增长10倍以上。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值