Hive - 分层组的多个(平均)计数不同

Posted

技术标签:

【中文标题】Hive - 分层组的多个(平均)计数不同【英文标题】:Hive - multiple (average) count distincts over layered groups 【发布时间】:2018-08-22 02:38:52 【问题描述】:

给定以下源数据(假设表名是user_activity):

+---------+-----------+------------+
| user_id | user_type | some_date  |
+---------+-----------+------------+
| 1       | a         | 2018-01-01 |
| 1       | a         | 2018-01-02 |
| 2       | a         | 2018-01-01 |
| 3       | a         | 2018-01-01 |
| 4       | b         | 2018-01-01 |
| 4       | b         | 2018-01-02 |
| 5       | b         | 2018-01-02 |
+---------+-----------+------------+

我想得到以下结果:

+-----------+------------+---------------------+
| user_type | user_count | average_daily_users |
+-----------+------------+---------------------+
| a         | 3          | 2                   |
| b         | 2          | 1.5                 |
+-----------+------------+---------------------+

在同一个表上使用没有多个子查询的单个查询。


使用多个查询,我可以得到:

user_count:

select
  user_type,
  count(distinct user_id)
from user_activity
group by user_type

对于average_daily_users

select
  user_type,
  avg(distinct_users) as average_daily_users
from (
  select
    count(distinct user_id) as distinct_users
  from user_activity
  group by user_type, some_date
)
group by user_type

但我似乎无法编写一个一次性完成我想要的查询。我担心同一张表上的多个子查询对性能的影响(它必须扫描表两次......对吗?)我有一个相当大的数据源,希望最大限度地减少运行时间。

注意:这个问题的标题是 Hive,因为这是我正在处理的问题,但我认为这是一个足够通用的 SQL 问题,所以我不排除其他语言的答案。

注意 2:此问题与 my other question 共享窗口函数中 partition by 列的详细信息(用于计算平均每日用户列)。

【问题讨论】:

【参考方案1】:

这应该做你想做的:

select ua.user_type,
       count(distinct ua.user_id) as user_count,
       count(distinct some_date || ':' || ua.user_id) / count(distinct some_date)
from user_activity ua
group by ua.user_type;

【讨论】:

好主意!我什至没有考虑自己做平均。感觉太不对了,又太对了。 TYVM!

以上是关于Hive - 分层组的多个(平均)计数不同的主要内容,如果未能解决你的问题,请参考以下文章

每个日期/时间具有多个组的 MySQL 查询计数

Hive 计数不同的 UDAF

Pig:文件中不同元组的计数频率

Hive 分组中的减速器数量和计数(不同)

按组的每个出现值构建计数列

如何在没有任何统计数据(如 Pandas 中的平均值或计数)的情况下进行简单分组?