百度自研的互動式 SQL 資料倉儲Doris簡介

2021-09-11 16:30:16 字數 3210 閱讀 2737

doirs與傳統的關係庫相同,都是以表(table)的形式儲存資料,其中一張表包括行row和列column。

column分為兩類:key和value,從業務角度看,key和value可以分別對應維度和指標列。

doris主要包括三種資料模型:aggregate、uniq和duplicate,也是這篇文章主要介紹的。

假設業務有如下資料表

columnname

type

aggregationtype

comment

user_id

largeint

使用者id

date

date

資料灌入日期

city

varchar(20)

使用者所在城市

agesmallint

使用者年齡

***tinyint

使用者性別

last_visit_date

datetime

replace

使用者最後一次訪問時間

cost

bigint

sum使用者總消費

max_dwell_time

intmax

使用者最大停留時間

min_dwell_time

intmin

使用者最小停留時間

表中的列沒有設定aggregation type的列稱為key,而設定了aggregation type的稱為value。

目前共有四種aggregation type聚合型別,如下所示:

1 sum:求和,多行value累加

2 replace:替代,後插入的value替代之前的value

3 max:保留value最大值

4 min:保留value最小值

原理:實際匯入資料中相當於會根據key進行group by,然後value值輸出相應aggregation type的結果。與使用聚合函式後的sql相同,明細資料會丟失,只保留聚合後的結果。如果想要保留明細資料,可以加入key欄位timestamp從而保證每一行的key都不相同。

在某些多維分析場景下,使用者更關注的是如何保證 key 的唯一性,即如何獲得 primary key 唯一性約束。因此doris引入了 uniq 的資料模型。該模型本質上是聚合模型的乙個特例,也是一種簡化的表結構表示方式。

假設業務有如下資料表

columnname

type

iskey

comment

user_id

bigint

yes使用者id

username

varchar(50)

yes使用者暱稱

city

varchar(20)

no使用者所在城市

agesmallint

no使用者年齡

***tinyint

no使用者性別

phone

largeint

no使用者**

address

varchar(500)

no使用者住址

register_time

datetime

no使用者註冊時間

而這個表結構,完全同等於以下使用聚合模型描述的表結構:

columnname

type

aggregationtype

comment

user_id

bigint

使用者id

username

varchar(50)

使用者暱稱

city

varchar(20)

replace

使用者所在城市

agesmallint

replace

使用者年齡

***tinyint

replace

使用者性別

phone

largeint

replace

使用者**

address

varchar(500)

replace

使用者住址

register_time

datetime

replace

使用者註冊時間

在某些多維分析場景下,資料既沒有主鍵,也沒有聚合需求。例如常見的日誌表log。

假設業務有如下資料表

columnname

type

sortkey

comment

timestamp

datetime

yes日誌時間

type

intyes

日誌型別

error_code

intyes

錯誤碼error_msg

varchar(1024)

no錯誤詳細資訊

op_id

bigint

no負責人id

op_time

datetime

no處理時間

建表語句如下:

create table if not exists example_db.expamle_tbl

( `timestamp` datetime not null comment "日誌時間",

`type` int not null comment "日誌型別",

`error_code` int comment "錯誤碼",

`error_msg` varchar(1024) comment "錯誤詳細資訊",

`op_id` bigint comment "負責人id",

`op_time` datetime comment "處理時間"

)duplicate key(`timestamp`, `type`)

... /* 省略 partition 和 distribution 資訊 */

這種資料模型區別於 aggregate 和 uniq 模型。資料完全按照匯入檔案中的資料進行儲存,不會有任何聚合。即使兩行資料完全相同,也都會保留。 而在建表語句中指定的 duplicate key,只是用來指明底層資料按照那些列進行排序。(更貼切的名稱應該為 「sorted column」,這裡取名 「duplicate key」 只是用以明確表示所用的資料模型。

reference

get,post,jsonp資料互動 百度下拉列表

三種資料互動形式 get post jsonp 一 get請求 1.引入 vue.js 和 vue resource.js 準備乙個按鈕 input type button value 按鈕 click get 點選按鈕請求資料函式get 2.準備乙個txt檔案 welcome vue 3.編寫js...

百度 mysql的sql優化 SQL優化問題

該樓層疑似違規已被系統摺疊 隱藏此樓檢視此樓 select cust.code,org.name4 district,org.name3 center,org.name2 org,org.name1,cont.contract code contract num,req.biz type,req.l...

自百度6 28事件後的自我反省

相信很多站長都難逃6.28事件的影響,筆者也在此次風波當中被徹底的擊敗,而且敗的是淋漓盡致 筆者幾乎所有 都倒下了,無論是正規的 還是擦邊的 都沒辦法逃過此次劫難,最讓人可悲的是事後無論如何去分析原因 都沒辦法摸透究竟 哪個因素會導致大規模k站,直到最後官方發布事件宣告才稍微了解到問題的所在。一 6...