Hive中Left Anti Join 的最佳实践

    技术2022-08-10  94

    引言:今天想说的是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中是不存在的!!!!! 后面的增量同步相信也会给大家一点思路

    如果大家缺数据集的话我可以给大家提供一些,今天就到这里了。

    Processed: 0.015, SQL: 9