在 HIVE 中使用 DISTINCT 和 GROUP BY

Posted

技术标签:

【中文标题】在 HIVE 中使用 DISTINCT 和 GROUP BY【英文标题】:Using DISTINCT along with GROUP BY in HIVE 【发布时间】:2021-03-19 13:03:35 【问题描述】:

我是使用 Hive 的新手,但我正在尝试打印一张表格,其中包含不同城市的车身类型总数。

 select body_type, city, count(body_type) AS total_for_body
 from usedcartestfinal
 group by body_type, city
 order by total_for_body DESC
 LIMIT 20;

当我运行上述命令时,我得到了重复城市的打印结果,我只想打印一个城市,我想我会使用 SELECT DISTINCT city,但我不能,因为我得到一个错误Group By 不能在同一个查询中使用。

不太确定如何处理此查询,任何建议或建议将不胜感激。

这是我的输出:https://imgur.com/BfQVsjF

我基本上只希望休斯顿打印一次,因为那里销量最高的是 SUV/CROSSOVER

【问题讨论】:

打印一次?由于您按两列分组,因此可以多次返回每个城市。如果您只希望每个城市一次,您必须决定返回哪个不同的 body_type 值。 @jarlh 你是什么意思?当我运行我的查询时,这就是我得到的,imgur.com/BfQVsjF,基本上我只希望休斯顿打印一次,因为他们卖得最多的是 SUV。所以不太清楚该怎么做 能否提供usedcartestfinal 表的示例方案?该表有哪些列以及哪些数据类型? 【参考方案1】:

您应该从group by 子句中删除body_type,而是对其进行明确计数:

select   city, count(distinct body_type) AS total_for_body 
from     usedcartestfinal 
group by city
order by total_for_body DESC LIMIT 20;

【讨论】:

【参考方案2】:

如果您将BODY_TYPE 包含在GROUP BY 中,那么它将按BODY_TYPECITY 分组,因此对于每个CITY 和每个BODYTYPE,您将获得一行。

您应该从GROUP BYSELECT 列表中删除BODYTYPE,如下所示:

SELECT * FROM 
(SELECT BODY_TYPE,
       CITY,
       COUNT(DISTINCT BODY_TYPE) AS TOTAL_FOR_BODY,
       ROW_NUMBER() OVER (PARTITION BY CITY 
                          ORDER BY COUNT(DISTINCT BODY_TYPE) DESC) AS RN
  FROM USEDCARTESTFINAL
 GROUP BY BODY_TYPE,
          CITY) AS T WHERE RN = 1
 ORDER BY TOTAL_FOR_BODY DESC LIMIT 20;

【讨论】:

我需要包含 body_type 以显示该城市的 body_type 数量。例如:休斯顿 |轿车 | 500 但我需要排除同一个城市再次出现,休斯顿 |轿跑车 | 300.我不确定这是否有意义。 所以您只想查看每个城市销量最高的car_body_type?对吗? 好的,我已经使用分析功能按计数排序,您会发现每个城市的结果中只有一条记录。【参考方案3】:

使用带有分析row_number的子查询来获取每个城市的最高计数记录:

select body_type, city, total_for_body
from
( 
select  body_type, city, total_for_body
        row_number() over(partition by city order by total_for_body desc) rn
from
(
 select body_type, city, count(body_type) total_for_body
 from usedcartestfinal
group by body_type, city
)s
)s where rn = 1

【讨论】:

我怀疑背后的数据模型可以以更易于处理的方式创建,但如果您刚刚开始使用 SQL,这将是相当难以承受的。我会将car_body_typescities 存储在不同的表中并创建第三个关系表。然后使用简单的连接查询会更容易

以上是关于在 HIVE 中使用 DISTINCT 和 GROUP BY的主要内容,如果未能解决你的问题,请参考以下文章

hive distinct关键字

如何编写查询以避免在 select distinct 和 size collect_set hive 查询中使用单个 reducer?

Hive SQL优化之 Count Distinct

HIVE-----count(distinct ) over() 无法使用解决办法

在 Hive 表中重命名名称为 count( distinct( id )) 的列

hive mysql count distinct 多列