1. WITH table_name AS ();
2.FROM table_name ( INSERT INTO table_name SELECT a ,b)
3.ROLLUP/ CUBE/ GROUPING SETS 窗口函数
首先如果你想读懂这篇文章,你需要对以上3个点 都有一定的了解。
1. WITH table_name AS ();
https://blog.csdn.net/u010003835/article/details/105399470
2.FROM table_name ( INSERT INTO table_name SELECT a ,b)
https://blog.csdn.net/u010003835/article/details/105400140
3.ROLLUP/ CUBE/ GROUPING SETS 窗口函数
https://blog.csdn.net/u010003835/article/details/105353510
假设,我们有这样一个场景。
、
数据统计背景:
我们现在有多个公司,多个部门,多位员工的薪水情况。现在我们需要按照多种维度去统计薪水。
同时我们有多张结果表,那么就需要我们在统计的同时,将数据放入多张结果表中。
首先 我们构建下基础的表
use data_warehouse_test;
CREATE TABLE IF NOT EXISTS datacube_salary_org (
company_name STRING COMMENT '公司名称'
,dep_name STRING COMMENT '部门名称'
,user_id BIGINT COMMENT '用户id'
,user_name STRING COMMENT '用户姓名'
,salary DECIMAL(10,2) COMMENT '薪水'
,create_time DATE COMMENT '创建时间'
,update_time DATE COMMENT '修改时间'
)
PARTITIONED BY(
pt STRING COMMENT '数据分区'
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS TEXTFILE
;
CREATE TABLE IF NOT EXISTS datacube_salary_basic_aggr(
company_name STRING COMMENT '公司名称'
,dep_name STRING COMMENT '部门名称'
,user_id BIGINT COMMENT '用户id'
,salary DECIMAL(10,2) COMMENT '薪水'
)
STORED AS ORC
;
CREATE TABLE IF NOT EXISTS datacube_salary_dep_aggr(
company_name STRING COMMENT '公司名称'
,dep_name STRING COMMENT '部门名称'
,total_salary DECIMAL(10,2) COMMENT '薪水'
)
STORED AS ORC
;
CREATE TABLE IF NOT EXISTS datacube_salary_company_aggr(
company_name STRING COMMENT '公司名称'
,total_salary DECIMAL(10,2) COMMENT '薪水'
)
STORED AS ORC
;
CREATE TABLE IF NOT EXISTS datacube_salary_total_aggr(
total_salary DECIMAL(10,2) COMMENT '薪水'
)
STORED AS ORC
;
创建一个txt 文件,填入以下内容
s.zh,engineer,1,szh,28000.0,2020-04-07,2020-04-07
s.zh,engineer,2,zyq,26000.0,2020-04-03,2020-04-03
s.zh,tester,3,gkm,20000.0,2020-04-07,2020-04-07
x.qx,finance,4,pip,13400.0,2020-04-07,2020-04-07
x.qx,finance,5,kip,24500.0,2020-04-07,2020-04-07
x.qx,finance,6,zxxc,13000.0,2020-04-07,2020-04-07
x.qx,kiccp,7,xsz,8600.0,2020-04-07,2020-04-07
创建分区 & LOAD文件
创建分区
ALTER TABLE datacube_salary_org ADD PARTITION (pt = '20200405');
LOAD 文件的标准用法
LOAD DATA [LOCAL] INPATH 'filepath' [OVERWRITE] INTO TABLE tablename [PARTITION (partcol1=val1, partcol2=val2 ...)]
LOAD数据
LOAD DATA LOCAL INPATH '/opt/hive/my_script/data_warehouse_test/rollup_table/org_data.txt' OVERWRITE INTO TABLE datacube_salary_org PARTITION (pt = '20200405');
现在结合上面的用法,
1. WITH table_name AS ();
2.FROM table_name ( INSERT INTO table_name SELECT a ,b)
3.ROLLUP/ CUBE/ GROUPING SETS 窗口函数
数据的组织关系是 公司 -> 部门 -> 人 -> 薪水
我们在一个SQL中对多个维度进行统计 (按照 人,部门, 公司,整体 4个维度),并放入到结果表中
WITH tmp_mid as (
SELECT
grouping__id
,company_name
,dep_name
,user_id
,SUM(salary) AS total_salary
FROM datacube_salary_org
WHERE pt = '20200407'
GROUP BY
company_name
,dep_name
,user_id
WITH ROLLUP
)
FROM tmp_mid
INSERT OVERWRITE TABLE datacube_salary_basic_aggr
SELECT
company_name
,dep_name
,user_id
,total_salary
WHERE grouping__id = 7
INSERT OVERWRITE TABLE datacube_salary_dep_aggr
SELECT
company_name
,dep_name
,total_salary
WHERE grouping__id = 3
INSERT OVERWRITE TABLE datacube_salary_company_aggr
SELECT
company_name
,total_salary
WHERE grouping__id = 1
INSERT OVERWRITE TABLE datacube_salary_total_aggr
SELECT
total_salary
WHERE grouping__id = 0
;
我们介绍下这几个表
datacube_salary_basic_aggr 基本的 (公司, 部门, 个人级别) 薪水的统计表
datacube_salary_dep_aggr 公司,部门级别的薪水的统计表
datacube_salary_company_aggr 公司级别的薪水的统计表
datacube_salary_total_aggr 整体薪水的统计表