版权声明:转载需注释。 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