Doris-----集計集計モデルとケースの実装

集約モデル

同じキーを持つデータを自動集計するテーブルモデルです。テーブル内の列は、AggregationType が設定されているかどうかに応じて Key (ディメンション列) と Value (インジケーター列) に分けられ、AggregationType が設定されていないものを Key、AggregationType が設定されているものを Value と呼びます。データをインポートすると、同じ Key 列を持つ行は 1 つの行に集約され、Value 列は設定された AggregationType に従って集約されます。AggregationType には現在、次の 4 つの集計メソッドがあります。

  • SUM: 複数行の値を合計した合計。

  • REPLACE: 置換。データの次のバッチの値が、以前にインポートされた行の値を置き換えます。

  • REPLACE_IF_NOT_NULL: NULL 値が見つかった場合は更新しません。

  • MAX:最大値を維持します。

  • MIN: 最小値を維持します。

次のようなシナリオがあります。社内の各ユーザーのあらゆる消費行動情報を記録するために、次のフィールドを含むテーブルを作成する必要があります。

ユーザーID データ挿入日 性別 面接時間 それぞれの消費量 利用者の滞在期間
10000 2017/10/1 北京 20 0 2017/10/01 06:00:00 20 10
10000 2017/10/1 北京 20 0 2017/10/01 07:00:00 15 2
10000 2017/10/1 北京 20 0 2017/10/01 08:00:00 30 15
10001 2017/10/1 北京 30 1 2017/10/01 17:05:45 2 22

さらに、同社はこのデータとレポートを特に懸念しています

各ユーザーが最後にページを訪問した時刻、ユーザーが費やした合計金額、ユーザーがページに滞在した最大時間と最小時間。

ユーザーID データ挿入日 性別 前回の訪問時間 このユーザーの総消費量 このユーザーの最大滞在期間 ユーザーの最低滞在期間
10000 2017/10/1 北京 20 0 2017/10/01 08:00:00 65 15 2
10001 2017/10/1 北京 30 1 2017/10/01 17:05:45 2 22 22

 このレポートを表示するたびに、「詳細テーブル」に対して統計 SQL を実行する必要があります。

Select
    user_id,data,city,age,gender,
    max(visit_data) as last_visit_data,
    sum(cost) as cost,
    max(dwell_time) as max_dwell_time,
    min(dwell_time) as min_dwell_time
From  t
Group by  user_id,data,city,age,gender  -- 对应的是聚合模型型key

 集約モデル

ユーザーID データ挿入日 性別 前回の訪問時間 このユーザーの総消費量 このユーザーの最大滞在期間 ユーザーの最低滞在期間
10000 2017/10/1 北京 20 0 2017/10/01 08:00:00 65 15 2
10001 2017/10/1 北京 30 1 2017/10/01 17:05:45 2 22 22

 SQLの例:

-- 这是一个用户消费和行为记录的数据表
CREATE TABLE IF NOT EXISTS test.ex_user
(
 `user_id` LARGEINT NOT NULL COMMENT "用户 id",
 `date` DATE NOT NULL COMMENT "数据灌入日期时间",
 `city` VARCHAR(20) COMMENT "用户所在城市",
 `age` SMALLINT COMMENT "用户年龄",
 `sex` TINYINT COMMENT "用户性别",
 
 `last_visit_date` DATETIME REPLACE  DEFAULT "1970-01-01 00:00:00" COMMENT "用户最后一次访问时间",
 `cost` BIGINT SUM DEFAULT "0" COMMENT "用户总消费",
 `max_dwell_time` INT MAX DEFAULT "0" COMMENT "用户最大停留时间",
 `min_dwell_time` INT MIN DEFAULT "99999" COMMENT "用户最小停留时间" 
 )
ENGINE=olap
AGGREGATE KEY(`user_id`, `date`, `city`, `age`, `sex`)
-- 分区
-- 分桶
DISTRIBUTED BY HASH(`user_id`) BUCKETS 1;

 テーブルにデータを挿入する

insert into test.ex_user values\
(10000,'2017-10-01','北京',20,0,'2017-10-01 06:00:00',20,10,10),\
(10000,'2017-10-01','北京',20,0,'2017-10-01 07:00:00',15,2,2),\
(10001,'2017-10-01','北京',30,1,'2017-10-01 17:05:45',2,22,22),\
(10002,'2017-10-02','上海',20,1,'2017-10-02 12:59:12',200,5,5),\
(10003,'2017-10-02','广州',32,0,'2017-10-02 11:20:00',30,11,11),\
(10004,'2017-10-01','深圳',35,0,'2017-10-01 10:00:15',100,3,3),\
(10004,'2017-10-03','深圳',35,0,'2017-10-03 10:20:22',11,6,6);

 データを確認すると6個しかデータが残っていないことがわかりましたが、これはキーが同じ場合に以降の結果が集計されてしまうためです。

 事例の実装

 例

-- 数据
订单id,userId,商品id,购买件数,支付的金额,订单日期
1,u01,p01,2,20,2022-12-01
1,u01,p02,1,10,2022-12-01
1,u01,p01,1,10,2022-12-01
2,u02,p03,2,40,2022-12-01


需求:
创建一个doris的聚合模型的表,插入上述明细数据后,自动聚合出如下结果:

订单日期,订单id,userId,商品id,购买得总件数,支付总额

key是什么?
value是什么?


要求:
按天分区(每天一个分区)
每个分区要划分成2个桶
表的数据需要保存2个副本
表的数据初始存储介质指定为SSD
设置冷却时间为2023年6月5日18点

-- 建表语句

create table order_1
(
    `date` date COMMENT "日期时间",
    `oid` bigint COMMENT "订单id",
    `userid` varchar(255) COMMENT "用户id",
    `spid` varchar(255) COMMENT "商品id",
    `total` int sum COMMENT "商品总数",
    `pay` int sum COMMENT "支付总金额"

)
ENGINE=olap
AGGREGATE KEY(`date`,`oid`,`userid`,`spid`)
partition by range(`date`)
    (
        partition `p20221201` values less than ("2022-12-02"),
        partition `p20221202` values less than ("2022-12-03"),
        partition `p20221203` values less than ("2022-12-04")
    )
DISTRIBUTED BY HASH(`userid`) BUCKETS 2
properties(
    "replication_num"="2",
    "storage_medium" = "SSD"

);



-- 插入数据
insert into order_1 values
('2022-12-01',1,'u01','p01',2,20),
('2022-12-01',1,'u01','p02',1,10),
('2022-12-01',1,'u01','p01',1,10),
('2022-12-01',2,'u02','p03',2,40);

 

おすすめ

転載: blog.csdn.net/m0_53400772/article/details/130892860