聚合操作_多维聚合_编写代码 | 学习笔记

简介: 快速学习聚合操作_多维聚合_编写代码

开发者学堂课程【大数据 Spark 2020版(知识精讲与实战演练)第三阶段:聚合操作_多维聚合_编写代码】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/690/detail/12089


聚合操作_多维聚合_编写代码


多维聚合

简单概括,多维聚合就是在一个结果集当中既要呈现合计,小计,又要按照不同维度进行小计。是在一个结果集中完成不同维度的操作,一个维度可能是年、月或者类别,假如按照年月进行统计,又按照类别进行统计,最终得到的合计就是多维聚合。

1.编写代码

import org.apache.spark.sql.functions._

//需求 1:不同年,不同来源,PM 值的平均数

// select source,year,avg(pm)from ... group by source,year

pmFinal.groupBy( cols = 'source,'year)

根据 select 语句,avg 最终再结果集中呈现出的也是 avg(pm),这时需要 as pm,代码如下:

import org.apache.spark.sql.functions._

//需求 1:不同年,不同来源,PM 值的平均数

// select source,year,avg(pm) as pm from ... group by source,year

pmFinal.groupBy( cols = 'source,'year)

注:为了整体将 source 写在 year 前面

.agg(avg( ‘pm) as“pm”)

注:如果要使用 avg,首先要导入 org.apache.spark.sql.functions

//需求 2:在整个数据集中,按照不同的来源来统计 PM 值的平均数

// select source,avg(pm) as pm from ... group by source

pmFinal.groupBy( cols ='source)

.agg(avg( " pm) as "pm")

根据 select 语句返现需求 2 得出的结果集只有两列,而需求 1 得出的结果集有三列,如何将这两个结果集合并:

将转换操作生成的 dataframe 拿到

val postAndYearDF = pmFinal.groupBy( cols = 'source,'year)

.agg(avg( " pm) as "pm")

val postDF = pmFinal.groupBy( cols = "source)

.agg(avg( " pm) as "pm")

第一个 dataframe 为 postAndYearDF,第二个为 postDF,之后将两个 dataframe 合并到一个结果集中。

//合并在同一个结果集中

postAndYearDF.union(postDF)

现在不能进行 union,一个当中有三列,一个是两列,union 之后会很奇怪。可以在需求 2 下加上一列。

val postDF = pmFinal.groupBy( cols = "source)

.agg(avg( " pm) as "pm")

.select( cols = "source,"year," pm)

但是不存在 year 列,就需要造出这一列

.select( cols ='source, lit( literal = nul1) as "year","pm)

}

只要结果集维度相同就可以进行 union:

//合并在同一个结果集中

postAndYearDF.union(postDF)

.sort( sortExprs = "source,"year,"pm)

先按照来源进行排序,看不同来源统计的 pm 值有什么不同,source 相同按照 year 进行排序,如果 source 和 year 都相同,按照 pm 值进行排序。

.show()

}

运行查看结果:

在下图结果集当中统计了多种维度的结果,比如 source、year 和 pm 维度,这就是多维聚合。但是显示的结果集有些奇怪,合计应该在小计后面,所以在按照 year 列进行排序时注意是升序,null 要放在后面。

image.png

代码: postAndYearDF . union(postDF)

.sort( sortExprs = "source,"year.asc_nulls_last,"pm)

.show( )

}

再次运行查看结果:

image.png

在代码当中,多维聚合就要聚合多次,然后将多次聚合的结果再进行合并。

相关文章
|
关系型数据库 MySQL Linux
error: Failed dependencies: libncurses.so.5()(64bit) is needed by mysql-community-client-8.0.36-1.el7.x86_64 libtinfo.so.5()(64bit) is needed by mysql-community-client-8.0.36-1.el7.x86_64 如何解决?
error: Failed dependencies: libncurses.so.5()(64bit) is needed by mysql-community-client-8.0.36-1.el7.x86_64 libtinfo.so.5()(64bit) is needed by mysql-community-client-8.0.36-1.el7.x86_64 如何解决?
1967 3
场效应三极管及其放大电路(1)MOSFET详解
场效应三极管及其放大电路(1)MOSFET详解
1824 1
|
数据采集 监控 数据可视化
分享78个Python源代码总有一个是你想要的
分享78个Python源代码总有一个是你想要的
167 0
|
监控 安全 Windows
防御闪避:Windows日志清理
防御闪避是一种网络杀伤链攻击策略,其中包括攻击者用来防止在受到侵犯时被检测到的策略。
424 0
防御闪避:Windows日志清理
|
前端开发 开发工具 git
release-it帮我做了哪些自动化的事情
假如我们变更了一部分代码,一般都要先提交 推送到代码服务器
317 0
|
前端开发 API C++
Antd中代码示例是怎么在CodeSandBox中打开的
使用过Antd的小伙伴应该很熟悉,Antd组件文档有在CodeSandBox和CodePen中打开直接预览和编辑的功能,这么炫酷且实用的功能具体是怎么实现的?
Antd中代码示例是怎么在CodeSandBox中打开的
|
开发工具 图形学
|
16天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
下一篇
开通oss服务