1. 程式人生 > >Hive-實戰記錄1

Hive-實戰記錄1

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