Hive_Hive 中 结合 with 临时表 , FROM ** INSERT 多表插入, ROLLUP/ CUBE/ GROUPING SETS 窗口函数 优化统计写入逻辑

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  整体薪水的统计表

发布了519 篇原创文章 · 获赞 1146 · 访问量 283万+

猜你喜欢

转载自blog.csdn.net/u010003835/article/details/105394136