在 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_TYPE
和CITY
分组,因此对于每个CITY
和每个BODYTYPE
,您将获得一行。
您应该从GROUP BY
和SELECT
列表中删除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_types
和cities
存储在不同的表中并创建第三个关系表。然后使用简单的连接查询会更容易以上是关于在 HIVE 中使用 DISTINCT 和 GROUP BY的主要内容,如果未能解决你的问题,请参考以下文章
如何编写查询以避免在 select distinct 和 size collect_set hive 查询中使用单个 reducer?
HIVE-----count(distinct ) over() 无法使用解决办法