如何基于Hive历史表的loaded_timestamp获取两日数据差异?
解决Hive历史表两日数据差异查询问题
我来帮你搞定这个需求!你的目标是找出仅存在于前一日数据中,但当日数据里没有的email地址,原查询存在几个语法和逻辑上的问题,我来一步步修正并给出正确的写法。
原查询的问题点
- 表别名重复使用(t1、t2),且
LEFT OUTER JOIN缺少关键的ON关联条件 current_timestamp返回的是带时分秒的完整时间戳,和你示例里的日期格式(如2020-03-08)不匹配,应该用日期类型的函数获取当日日期- 筛选差异的逻辑错误:要找前一日有但当日没有的记录,应该判断左连接后右侧表的email字段为
NULL,而非t1.email!=t2.email
正确的查询写法
方法1:使用LEFT JOIN关联筛选
SELECT t_prev.email_addr FROM ( SELECT email_addr FROM your_table WHERE loaded_timestamp = date_sub(current_date, 1) -- 获取前一日数据 ) t_prev LEFT OUTER JOIN ( SELECT email_addr FROM your_table WHERE loaded_timestamp = current_date -- 获取当日数据 ) t_curr ON t_prev.email_addr = t_curr.email_addr WHERE t_curr.email_addr IS NULL; -- 筛选出前一日有、当日没有的email
方法2:使用NOT EXISTS子查询
如果你觉得子查询更直观,也可以用这种方式:
SELECT email_addr FROM your_table WHERE loaded_timestamp = date_sub(current_date, 1) AND NOT EXISTS ( SELECT 1 FROM your_table t_curr WHERE t_curr.loaded_timestamp = current_date AND t_curr.email_addr = your_table.email_addr );
针对示例数据的验证
用你给出的示例数据:
- 2020-03-08的email:
xxx@gmail.com、yyy@gmail.com、zzz@gmail.com - 2020-03-09的email:
xxx@gmail.com、yyy@gmail.com
执行上述查询后,会正确返回zzz@gmail.com,完全符合你的期望结果。
额外提示
如果你的loaded_timestamp字段是带时分秒的时间戳类型,只需要把current_date换成date(current_timestamp),确保日期匹配即可。
内容的提问来源于stack exchange,提问作者Saranya Ravikumar
相关产品推荐
相关产品推荐

