hive总结四:建表实战训练(建表代码中涉及的知识点解析)

目录

一:建表代码

二:数据模型

三: 范围分区:partition by range

四:hash分桶

五.其他


一:建表代码

CREATE TABLE `heheyotubehehe_ads_people_kehuduan_experience_data` (
  `day` int(11) NOT NULL DEFAULT "0" COMMENT "",
  `os` varchar(50) NULL COMMENT "",
  `soft_version` varchar(50) NULL COMMENT "",
  `is_app_new` varchar(50) NULL COMMENT " 是否是新用户",
  `disp_pv` int(11) NULL DEFAULT "0" COMMENT "弹窗一展现pv",
  `disp_uv` int(11) NULL DEFAULT "0" COMMENT "弹窗一展现uv",
  `agree_clk_uv` int(11) NULL DEFAULT "0" COMMENT "弹窗一同意按钮点击uv",
  `disagree_clk_uv` int(11) NULL DEFAULT "0" COMMENT "弹窗一不同意按钮点击uv",
  `second_disp_pv` int(11) NULL DEFAULT "0" COMMENT 私弹窗二展现pv",
  `second_disp_uv` int(11) NULL DEFAULT "0" COMMENT "弹窗二展现uv",
  `second_agree_clk_uv` int(11) NULL DEFAULT "0" COMMENT "弹窗二同意按钮点击uv",
  `second_think_clk_uv` int(11) NULL DEFAULT "0" COMMENT "弹窗二不同意按钮点击uv",
  `third_disp_pv` int(11) NULL DEFAULT "0" COMMENT "弹窗三展现pv",
  `third_disp_uv` int(11) NULL DEFAULT "0" COMMENT "弹窗三展现uv",
  `third_check_agreement_clk_uv` int(11) NULL DEFAULT "0" COMMENT "弹窗三查看协议按钮点击uv",
  `third_exit_clk_uv` int(11) NULL DEFAULT "0" COMMENT "弹窗三退出应用按钮点击uv",
) ENGINE=OLAP
AGGREGATE KEY(`day`, `os`, `soft_version`, `is_app_new`,  `disp_pv`, `disp_uv`, 
`agree_clk_uv`, `disagree_clk_uv`, `second_disp_pv`, 
`second_disp_uv`, `second_agree_clk_uv`, `second_think_clk_uv`,
 `third_disp_pv`, `third_disp_uv`, `third_check_agreement_clk_uv`, 
`third_exit_clk_uv`, `device_disp_pv`, `device_disp_uv`, 
`device_dis_uv`, `device_agree_clk_uv`, `device_disagree_clk_uv`,
 `glide_disp_pv`, `glide_disp_uv`, `glide_dis_uv`)
COMMENT "【heheyotubehehe】体验报表"
PARTITION BY RANGE(`day`)
(PARTITION p202104 VALUES [("20210401"), ("20210501")),
PARTITION p202105 VALUES [("20210501"), ("20210601")),
PARTITION p202106 VALUES [("20210601"), ("20210701")),
PARTITION p202107 VALUES [("20210701"), ("20210801")))
DISTRIBUTED BY HASH(`day`) BUCKETS 10
PROPERTIES (
"replication_num" = "3",
"dynamic_partition.enable" = "true",
"dynamic_partition.time_unit" = "MONTH",
"dynamic_partition.time_zone" = "Asia/Shanghai",
"dynamic_partition.start" = "-360",
"dynamic_partition.end" = "3",
"dynamic_partition.prefix" = "p",
"dynamic_partition.replication_num" = "3",
"dynamic_partition.buckets" = "10",
"dynamic_partition.start_day_of_month" = "1",
"in_memory" = "false",
"storage_format" = "V2"
);

[备注:字段随便起的,不涉及商业机密,若有侵权必删]

二:数据模型

代码中出现了aggregate key,他属于一种数据模型。

    Doris 这类 MPP 架构的 OLAP 数据库,通常都是通过提高并发,来处理大量数据的.

    Doris 的数据模型主要分为3类:Aggregate, Uniq, Duplicate.

    Aggregate模型:在doris中通过key来决定value的聚合粒度大小。

    Uniq模型:这类数据没有聚合需求,只需要保证主键的唯一性

    Duplicate模型:在某些多维分析场景下,数据既没有主键,也没有聚合需求

数据模型的选择建议:

1)Aggregate 模型可以通过预聚合,极大地降低聚合查询时所需扫描的数据量和查询的计算量,

非常适合有固定模式的报表类查询场景。但是该模型对 count(*) 查询很不友好。

同时因为固定了 Value 列上的聚合方式,在进行其他类型的聚合查询时,需要考虑语意正确性。
2)Uniq 模型针对需要唯一主键约束的场景,可以保证主键唯一性约束。

但是无法利用 ROLLUP 等预聚合带来的查询优势(因为本质是 REPLACE,没有 SUM 这种聚合方式)。
3)Duplicate 适合任意维度的 Ad-hoc 查询。虽然同样无法利用预聚合的特性,

但是不受聚合模型的约束,可以发挥列存模型的优势(只读取相关列,而不需要读取所有 Key 列)。

三: 范围分区:partition by range

代码中出现来partition by range('day')  

doris支持两级分区存储:第一层为range分区(partition),第二层为hash分桶(bucket)

partition by range语法:

partition by range('day')(

partition  分区名1  values  分区范围1

partition  分区名2  values  分区范围2

四:hash分桶

代码中出现的distributed by hash('day') buckets 10

根据hash值将数据划分成不同的 bucket。

1)建议采用区分度大的列做分桶, 避免出现数据倾斜
2)为方便数据恢复, 建议单个 bucket 的 size 不要太大, 保持在 10GB 以内,

   所以建表或增加 partition 时请合理考虑 bucket 数目, 其中不同 partition 可指定不同的 buckets 数。

五.其他

1)engine=olap

2)  aggregate key后面括号中的字段与前面定义的字段一一对应。

3)properties中是一些固定的选择。

 

参考文献:

https://blog.csdn.net/m0_37622868/article/details/82849108

https://blog.csdn.net/u012150370/article/details/104783173

 
上一篇:基于单片机(AT89C51)的进制转换及进制计算器


下一篇:Luat模块应用手册-示例-Luat 示例-LCD drive(LCD驱动显示)