Doris之sequence列
sequence列
sequence列目前只支持Uniq模型,Uniq模型主要针对需要唯一主键的场景,可以保证主键唯一性约束,但是由于使用REPLACE聚合方式,在同一批次中导入的数据,替换顺序不做保证,详细介绍可以参考这里。替换顺序无法保证则无法确定最终导入到表中的具体数据,存在了不确定性。
为了解决这个问题,Doris支持了sequence列,通过用户在导入时指定sequence列,相同key列下,REPLACE聚合类型的列将按照sequence列的值进行替换,较大值可以替换较小值,反之则无法替换。该方法将顺序的确定交给了用户,由用户控制替换顺序。
原理
通过增加一个隐藏列__DORIS_SEQUENCE_COL__实现,该列的类型由用户在建表时指定,在导入时确定该列具体值,并依据该值对REPLACE列进行替换。
建表
创建Uniq表时,将按照用户指定类型自动添加一个隐藏列__DORIS_SEQUENCE_COL__
导入
导入时,fe在解析的过程中将隐藏列的值设置成 order by 表达式的值(broker load和routine load),或者function_column.sequence_col表达式的值(stream load), value列将按照该值进行替换。隐藏列__DORIS_SEQUENCE_COL__的值既可以设置为数据源中一列,也可以是表结构中的一列。
读取
请求包含value列时需要需要额外读取__DORIS_SEQUENCE_COL__列,该列用于在相同key列下,REPLACE聚合函数替换顺序的依据,较大值可以替换较小值,反之则不能替换。
#Cumulative Compaction
Cumulative Compaction 时和读取过程原理相同
#Base Compaction
Base Compaction 时读取过程原理相同
语法
建表时语法方面在property中增加了一个属性,用来标识__DORIS_SEQUENCE_COL__的类型 导入的语法设计方面主要是增加一个从sequence列的到其他column的映射,各个导入方式设置的将在下面介绍
建表
创建Uniq表时,可以指定sequence列类型
PROPERTIES ("function_column.sequence_type" = 'Date',
);
sequence_type用来指定sequence列的类型,可以为整型和时间类型
#stream load
stream load 的写法是在header中的function_column.sequence_col字段添加隐藏列对应的source_sequence的映射, 示例
curl --location-trusted -u root -H “columns: k1,k2,source_sequence,v1,v2” -H “function_column.sequence_col: source_sequence” -T testData http://host:port/api/testDb/testTbl/_stream_load
#broker load
在ORDER BY 处设置隐藏列映射的source_sequence字段
LOAD LABEL db1.label1
(DATA INFILE("hdfs://host:port/user/data/*/test.txt")INTO TABLE `tbl1`COLUMNS TERMINATED BY ","(k1,k2,source_sequence,v1,v2)ORDER BY source_sequence
)
WITH BROKER 'broker'
("username"="user","password"="pass"
)
PROPERTIES
("timeout" = "3600"
);
#routine load
映射方式同上,示例如下
CREATE ROUTINE LOAD example_db.test1 ON example_tbl [WITH MERGE|APPEND|DELETE]COLUMNS(k1, k2, source_sequence, v1, v2),WHERE k1 > 100 and k2 like "%doris%"[ORDER BY source_sequence]PROPERTIES("desired_concurrent_number"="3","max_batch_interval" = "20","max_batch_rows" = "300000","max_batch_size" = "209715200","strict_mode" = "false")FROM KAFKA("kafka_broker_list" = "broker1:9092,broker2:9092,broker3:9092","kafka_topic" = "my_topic","kafka_partitions" = "0,1,2,3","kafka_offsets" = "101,0,0,200");
启用sequence column支持
在新建表时如果设置了function_column.sequence_type ,则新建表将支持sequence column。 对于一个不支持sequence column的表,如果想要使用该功能,可以使用如下语句: ALTER TABLE example_db.my_table ENABLE FEATURE “SEQUENCE_LOAD” WITH PROPERTIES (“function_column.sequence_type” = “Date”) 来启用。 如果确定一个表是否支持sequence column,可以通过设置一个session variable来显示隐藏列 SET show_hidden_columns=true ,之后使用desc tablename,如果输出中有__DORIS_SEQUENCE_COL__ 列则支持,如果没有则不支持
使用示例
下面以stream load 为例 展示下使用方式
创建支持sequence column的表
表结构如下:
MySQL > desc test_table;
+-------------+--------------+------+-------+---------+---------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-------+---------+---------+
| user_id | BIGINT | No | true | NULL | |
| date | DATE | No | true | NULL | |
| group_id | BIGINT | No | true | NULL | |
| modify_date | DATE | No | false | NULL | REPLACE |
| keyword | VARCHAR(128) | No | false | NULL | REPLACE |
+-------------+--------------+------+-------+---------+---------+
正常导入数据:
导入如下数据
1 2020-02-22 1 2020-02-22 a
1 2020-02-22 1 2020-02-22 b
1 2020-02-22 1 2020-03-05 c
1 2020-02-22 1 2020-02-26 d
1 2020-02-22 1 2020-02-22 e
1 2020-02-22 1 2020-02-22 b
此处以stream load为例, 将sequence column映射为modify_date列
curl --location-trusted -u root: -H "function_column.sequence_col: modify_date" -T testData http://host:port/api/test/test_table/_stream_load
结果为
MySQL > select * from test_table;
+---------+------------+----------+-------------+---------+
| user_id | date | group_id | modify_date | keyword |
+---------+------------+----------+-------------+---------+
| 1 | 2020-02-22 | 1 | 2020-03-05 | c |
+---------+------------+----------+-------------+---------+
在这次导入中,因sequence column的值(也就是modify_date中的值)中’2020-03-05’为最大值,所以keyword列中最终保留了c。
替换顺序的保证
上述步骤完成后,接着导入如下数据
1 2020-02-22 1 2020-02-22 a
1 2020-02-22 1 2020-02-23 b
查询数据
MySQL [test]> select * from test_table;
+---------+------------+----------+-------------+---------+
| user_id | date | group_id | modify_date | keyword |
+---------+------------+----------+-------------+---------+
| 1 | 2020-02-22 | 1 | 2020-03-05 | c |
+---------+------------+----------+-------------+---------+
由于新导入的数据的sequence column都小于表中已有的值,无法替换 再尝试导入如下数据
1 2020-02-22 1 2020-02-22 a
1 2020-02-22 1 2020-03-23 w
查询数据
MySQL [test]> select * from test_table;
+---------+------------+----------+-------------+---------+
| user_id | date | group_id | modify_date | keyword |
+---------+------------+----------+-------------+---------+
| 1 | 2020-02-22 | 1 | 2020-03-23 | w |
+---------+------------+----------+-------------+---------+
此时就可以替换表中原有的数据
Doris之sequence列相关推荐
- Doris部分列更新在广告行业应用
背景:业务需要在不同的时间点对同一个session_id上的广告行为(展示.点击.转换等)数据的更新. 基于HBase归因 更新原理:以session_id为Key在HBase中写入数据,数据更新是先 ...
- Doris之数据划分(全面)
数据划分 本文档主要介绍 Doris 的建表和数据划分,以及建表操作中可能遇到的问题和解决方法. 基本概念 在 Doris 中,数据都以表(Table)的形式进行逻辑上的描述. Row & C ...
- Doris(一)-简介、架构、编译、安装和数据表的基本使用
目录 1.Doris简介 2.Doris网址 3.Doris架构 3.编译和安装 3.1.软硬件需求 3.2.编译 3.2.1.安装Docker环境 3.2.2.使用Docker 开发镜像编译 3.3 ...
- 【Doris】Apache Doris 索引机制解析
1 引言 Apache Doris 存储引擎采用类似 LSM 树的结构提供快速的数据写入支持.进行数据导入时,数据会先写入 Tablet 对应的 MemTable 中,当 MemTable 写满之后, ...
- 最全的Apache Doris教程(收藏版)共9万+字【第一篇】由于是typora编写,有部分图片在本地,识别不出来,请细聊我
1.Doris 简介 1.1 Doris 概述 Apache Doris 由百度大数据部研发(之前叫百度 Palo,2018 年贡献到 Apache 社区后, 更名为 Doris ),在百度内部,有超 ...
- 昆仑分布式数据库Sequence功能及其实现机制
昆仑分布式数据库(下文简称昆仑或者昆仑数据库)的计算节点源自PostgreSQL,因此继承了PostgreSQL的Sequence功能,本文介绍昆仑分布式数据库的Sequence的功能用法.用例和实现 ...
- Doris 开发指南
1. Doris 简介 1.1 Doris 概述 Apache Doris 由百度大数据部研发(之前叫百度 Palo,2018 年贡献到 Apache 社区后, 更名为 Doris ),在百度内部,有 ...
- 基于 Apache Doris 数仓在作业帮的实践
1 背景 作业帮大数据团队主要负责建设公司级数仓,向公司各个重要产品线(拉新.教学.BI等)提供面向业务的数据信息,如到课时长.答题情况等.在过去半年多时间内,我们基于Apache Doris,构建了 ...
- 【遇见Doris】Doris基于Hive表的全局字典设计与实现
感谢7月25日来参加 Doris 与 Dolphin Scheduler 合作举办的线上 Meetup 的小伙伴们,现在为大家带来 Meetup 的内容. 本次 Meetup 请到了来自百度.奇安信. ...
最新文章
- Promise详解(一) ----基础用法
- python_xlsxwriter模块
- initrd.img解压和压缩
- 乘法逆元总结 3种基本方法
- 苹果cmsv10精仿迅播影院2tu风格主题模板
- 多云架构落地设计和实施方案【华为云分享】
- springboot获取项目路径_springboot学习
- IO口模拟SPI总线问题
- 施一公:无论什么学科,最不重要的就是智商
- mysql列名小写_MySQL表名、列名区分大小写详解
- 免费的视频转Gif软件
- 马宁伟-20年工作经验谈-4-男怕入错行
- 文本分割之垂直投影法基于OpenCV(python)的实现
- JZOJ5426. 【NOIP2017提高A组集训10.25】摘Galo
- java ip 获取了两个_用Java获取本地的多个IP地址
- HTML 样式style
- 单精度与双精度是什么意思,有什么区别?
- OpenCV图像处理-模糊
- oracle固定资产类别改不了,用友u8系统固定资产卡片类别写错了是不是改不了?...
- 阿里云国际站版注册教程