Hive Spark Partition by 和 Group by的区别(面试可以看看)

前言:

 

        最近在工作中发现有小伙伴对partition by 和 group by的概念、使用犯迷糊,只知道是做聚合用,却不知道其计算的过程和对应机制。闲言少叙,进入正题。😉😉

🌽🌽Partition by 和 Group by分别是什么🥜🥜

2.1 group by

😎😎😎group by 是一个高频使用的表达式,其主要应用过程就是将符合条件的数据集中到一个分组里面,然后进行聚合。

😎😎😎适用场景:分组求聚合值,例如最大,最小,求和等。

示例代码如下:😄😁😁

SELECT
	column1,
	column2,
	AGGREGATE_FUNCTION (column3)
FROM
	table1
GROUP BY
	column1,
	column2;

代码注解:

🐶🐶AGGREGATE_FUNCTION:聚合函数,常见的有Max,Sum,Min,Count

🐶🐶column1,column2:代表table中的列。

2.2 partition by

partition by 算子和窗口函数搭配使用,实现数据的窗口运算。

🐶🐶适用场景:分组组内排名,分组组内,分组聚合,以及分组组内范围数据计算。

示例代码:

SELECT 
    *,
    window_function_name( COL3 ) OVER (
        PARTITION by COL1,COL2
) FROM 
    table;

代码注解:

🐶🐱window_function_name:窗口函数,常见的有RANK,ROW_NUMBER,Max,Min,Sum等

🐭🐭COL[1-3]:代表table中的列。

3 🦄🦄🦄group by 和 partition by区别

简单介绍了Group by 和 partition by的使用方式和效果。下面则着重的介绍一些二者的区别,主要是应用上的区别,具体有两点:1、返回结果 2、返回列

3.1 返回结果区别

👇🏻👇🏻分别是聚合函数和窗口函数执行区别

  👇🏻👇🏻:代表一条数据,也就是row

 👉🏻👉🏻敲黑板!!👇🏻👇🏻面到必须会的:

        聚合函数:将多条数合并成一条,且把蓝色块的位置赋值为求和。🐯🐯🐯

        窗口函数:求出多条数据的累加值后,保留所有数据,并在所有数据后缀了累加值📢📢📢。

3.2 返回列区别

 👉🏻👉🏻敲黑板!!👇🏻👇🏻面到必须会的:

        Group by :使用group by时,select 中只能出现group by后面出现的列名,也就是说你用什么条件分组聚合,你就只能查什么。 

        partition by:使用partition by ,对Select 查询什么列名没有影响。

       

 3.3 具体原理

通过查看两种SQL的AST tree,来看一下他们的解析结果以及对应的原始执行顺序。这里的原始执行顺序指的是不经过编译器优化的执行顺序。

 

👇👇窗口函数的AST tree:        

SELECT *,sum(1) over (partition by depart_id) FROM employees;

 👇👇聚合函数的AST tree:

SELECT depart_id,sum(1)  FROM employees group by depart_id ;


        从上文中明显看到的就是窗口函数的解析位置和聚合函数解析位置一致,但是聚合函数的group by 的解析位置相对于来说比较靠后。换句话就是聚合函数,需要先执行Group by之后,再执行聚合函数。 

🧧🧧🧧感谢诸位大佬的阅读,创作不易,点个关注,收藏一下呗~

 

  • 8
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
是的,count over partition by 可以去重。在SQL中,使用count函数结合over和partition by子句可以实现对分组后的数据进行去重计数。具体实现方式是将count(distinct ) over(partition by order by)替换成size(collect_set() over(partition by order by))。这样可以求得分组后的去重个数。这种方法适用于既要保证原数据明细表不变,又要保证分组统计数据的场景。另外,还可以使用distinct关键字结合count函数来实现去重计数,例如select distinct name,count(*) over () from t_window where substring(orderdate,1,7) = '2015-04'。还可以使用group by子句来实现去重计数,例如select name,count(*) over () from t_window where substring(orderdate,1,7) = '2015-04' group by name。 #### 引用[.reference_title] - *1* [【hive&sparkHiveSql&SparkSql—COUNT(DISTINCT ) OVER (PARTITION BY )报错解决方案](https://blog.csdn.net/qyj19920704/article/details/126372968)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [Hive窗口函数Over partition by](https://blog.csdn.net/weixin_32265569/article/details/115475759)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大锤爱编程

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值