【问题标题】:Need to find a difference of data from the same table in hive需要在hive中查找同一张表的数据差异
【发布时间】:2020-03-09 13:21:59
【问题描述】:

我有一个加载了时间戳列的历史表。我需要使用时间戳列获取减去的数据。 逻辑:通过(loaded_timestamp -1)和current_timestamp减去数据得到email地址。只有减去的数据应该是输出。

选择查询:

select t1.email_addr
from (select *
      from table t1
      where loaded_timestamp = current_timestamp
     ) left outer join
     (select *
      from table t2
      where loaded_timestamp = date_sub(current_timestamp,1)
    )
where t1.email!=t2.email;

表格有以下列

Email address, First name , last name, loaded_timestamp. 
xxx@gmail.com,xxx,aaa,2020-03-08.   
yyy@gmail.com,yyy,bbb,2020-03-08. 
zzz@gmail.com,zzz,ccc,2020-03-08. 
xxx@gmail.com,xxx,aaa,2020-03-09. 
yyy@gmail.com,yyy,bbb,2020-03-09.

想要的结果

zzz@gmail.com

因此,如果从同一张表中减去两个日期,即 (2020-03-09 - 2020-03-08 )。我应该只得到不匹配的记录。匹配的记录应该被丢弃,不匹配的记录应该是输出。

【问题讨论】:

  • 我已经提供了所有的细节。数据集看起来像上面提到的例子,其中将有重复数据的加载_时间戳列。我的期望是收到当前日期不存在的电子邮件。注意:t1 n t2 属于同一张表。

标签: sql hive


【解决方案1】:

我能想到的最好的办法是您希望电子邮件只出现一次。如果是这种情况,请使用窗口函数:

select t.*
from (select t.*, count(*) over (partition by email) as cnt
      from t
     ) t
where cnt = 1;

如果您希望数据中包含电子邮件但未在当前日期加载,则:

select t.email
from t
group by t.email
having max(timestamp) <> current_date;

【讨论】:

  • 嗨,戈登,感谢您的回复。我需要收到今天不存在的电子邮件。如果一条记录与数据集从昨天到今天的日期匹配,则应将其丢弃,只有昨天不匹配的记录应作为我的输出。
  • @SaranyaRavikumar 。 . .这就是第二个查询的作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-12
相关资源
最近更新 更多