Hive - 每个日期选择不同的唯一 ID,无需创建外部表或使用 JOINS

Posted

技术标签:

【中文标题】Hive - 每个日期选择不同的唯一 ID,无需创建外部表或使用 JOINS【英文标题】:Hive - Select distinct unique IDs per date without creating external tables or using JOINS 【发布时间】:2018-11-29 06:30:57 【问题描述】:

我正在处理具有以下列的数据集:

unique_ID       Date
a               2018_09_08
a               2018_09_18
a               2018_09_28
d               2018_09_08

我希望选择在所有三个日期(即 2018_09_08、2018_09_18 和 2018_09_28)都出现的 Unique_ID。

我的输出应该只是'a'。

这个问题有一个很长的解决方案 - 每个日期提取 unique_IDs 并在所有三个之上创建外部表,然后在三个表上使用连接来获取所有三个日期的唯一 ID。我相信应该有一个更好的解决方案,因为在这种情况下我们只有 3 个日期,可能会在以后上升,所以我正在寻找一个更通用的解决方案。

这是我编写的查询 - select distinct(unique_ID) from table_name where Date = '2018_09_08' and Date = '2018_09_18' and Date = '2018_09_28' 返回 null。

我也在尝试编写子查询,但我怀疑 HIVE 在这种情况下是否支持此类子查询。这是我写的:

select count(distinct(unique_ID)) from (
(select distinct(unique_ID) from table_name where Date = '2018_09_08') a
union all
(select distinct(unique_ID) from table_name where Date = '2018_09_18') b
union all
(select distinct(unique_ID) from table_name where Date = '2018_09_28') c
);

我收到以下解析错误:FAILED: ParseException line 3:0 missing ) at 'union' near ')' line 4:87 missing EOF at 'b' near ')'

在这种情况下,我们如何获得 Unique_ID?

【问题讨论】:

你试过用 OR 代替 AND 吗? OR 将为我提供所有三天的不同 Unique_ID。所以它会给我a和b都来自上述情况,而我只想得到a,因为它在所有三个日期都很常见。 【参考方案1】:

这可以通过group byhaving 来完成。

select unique_id,count(distinct date)
from tbl
where date in ('2018_09_08','2018_09_18','2018_09_28')
group by id 
having count(distinct date) = 3

【讨论】:

我昨天自己得到的...忘记发布答案..这正是我所做的!谢谢你的努力,我真的很感激。

以上是关于Hive - 每个日期选择不同的唯一 ID,无需创建外部表或使用 JOINS的主要内容,如果未能解决你的问题,请参考以下文章

使用 sql (Hive) 中的条件为每个 ID 选择随机行

如何使用 SQL 选择每个唯一日期的唯一会话?

SQL - 帮助根据比例和唯一 ID 选择随机日期

选择每个月的最大日期

选择查询优化

如何在 Oracle SQL 中不使用 distinct 选择从多个 max(case when) 派生的唯一行