Hive-实战记录1

版权声明:转载需注释。 https://blog.csdn.net/qq_40266296/article/details/84401335

Hive-实战记录1

一般的SQL支持UPDATE等对table内数据进行改变等操作,Hive不支持。所以在具体业务中,需要重新定义具体value时,需要重新create新的table。
范例:
存在的table有:tmp_db.stream 和 tmp_db.tmp_dim_info,前者是流量记录,后者是维度记录。
id是key,pageid是support key,uv是相关流量。
tmp_db.tmp_dim_info:

id pageid actionYN createtime
13121 43 Y 2018-10-11
33312 42 N 2018-11-12
36441 41 N 2018-9-8
* 22 N 2018-7-2
42343 76 N 2018-10-7

tmp_db.stream :

id pageid uv
13121 43 10021312
33312 42 12312412
* 22 9088

第一步进行以下操作:

drop table if exists tmp_db.tmp_stream;
create table tmp_db.tmp_stream as 
select distinct 
    case when b.id='*' then 'multi' else '1' end as flag,
    b.*,
    a.uv
from tmp_db.stream a 
left join tmp_db.tmp_dim_info b on a.id=b.id 
where b.pageid='*' or a.pageid=b.pageid 
sort by uv desc,id,b.value

建立的table以维度表tmp_dim_info为主,left join了stream中两者id相同的情况,stream表保存了所有有流量的id。目的是在原维表上加一个flag维度,标记该id是否有uv。所以第一步创建有流量flag的部分。
tmp_db.tmp_stream结果如下:

flag id pageid actionYN createtime uv
1 13121 43 Y 2018-10-11 10021312
1 33312 42 N 201811-12 12312412
multi * 22 N 20187-2 9088

第二步建立无流量部分:
辅助table:tmp_db.nostream

id pageid uv
36441 41 0
42343 76 0
drop table if exists tmp.tmp_nostream;
CREATE table tmp_db.tmp_nostream as 
select distinct
 case when datediff(b.createtime,'2018-10-1') > 0 then '1' else '' end as flag,
 --createtime大于2018年10月1日就标记'1'else标记''
 b.*
from tmp_db.tmp_dim_info b 
left join tmp_db.nostream a on a.id=b.id  

由于2018年10月1日之前create的有可能因为没上线而导致没有流量,所以标记为1:

flag id pageid actionYN createtime uv
36441 41 N 2018-9-8 0
1 42343 76 N 2018-10-8 0

以上将有流量和无流量的条件都建立完成flag,之后union all就可以得到所需要的新表并且添加了一个flag维度。两个新生成的表有相同的结构,直接可以聚合。

drop table if exists tmp_db.tmp_dim_withflag;
create table tmp_db.tmp_dim_withflag as
SELECT *
FROM (
  select * from tmp_db.tmp_stream
  UNION ALL
  select * from tmp_db.tmp_nostream
) 

完成!

                 Markdown        0 字数     2 行数      当前行 2, 当前列 0

猜你喜欢

转载自blog.csdn.net/qq_40266296/article/details/84401335