引言:今天想说的是Hive中Left Anti Join根据需求的具体实践。
一、剖析需求
我们根据各种维度算出商品的转化率以及各种pv,并且要求每半小时更新一次,对于商品表现的各种数据,我们只更新增量,而不是全量。
这就引出了两张表,一张表记录增量,而另一张表记录半小时前的历史数据。
二、SQL实现
主要的两张表:current_log_detail_info、before_log_detail_info,字段一致假设都是a,b,c,UPDATE_DATA
1、我们先算一下当前时间的全量数据
SELECT * FROM 某些表聚合
2、然后我们找出相较之前的增量,插入表current_log_detail_info
INSERT OVERWRITE TABLE current_log_detail_info
(
SELECT *
FROM 某些表聚合
)current
LEFT ANTI JOIN
(
SELECT *
FROM before_log_detail_info
) before
ON before.a=current.a
AND before.b=current.b
AND before.c=current.c
解释:全字段筛选,一个字段值变化都算增量,这里要根据具体的需求
3、更新历史表-这时候增量已经产生我们更新历史数据
解释:在这里,我们分析的主要是商品在某一维度下的表现,如果该商品在某一维度下的数据第一次出现我们要插入,如果不是第一次出现我们要更新。我们统一操作完成两种操作看我怎么做的。
INSERT OVERWRITE TABLE before_log_detail_info
SELECT * FROM(
SELECT a,
b,
c,
ROW_NUMBER() OVER (PARTITION BY a,b,c ORDER BY update_data DESC ) AS num
FROM(
SELECT *
FROM current_log_detail_info
UNION
SELECT *
FROM before_log_detail_info
)) update
WHERE num=1
注意:大家这里也看到了,我利用开窗和日志的更新时间,来插入和更新一块操作。
到这里,需求也基本上解决了,可以看到Left Anti Join并不是真正的Left Join 更像是 a not in b,也就是根据字段查找a中的哪一行数据在b中是不存在的!!!!!
后面的增量同步相信也会给大家一点思路
如果大家缺数据集的话我可以给大家提供一些,今天就到这里了。