PySpark DataFrame多列多函数聚合与行式结果呈现

PySpark DataFrame多列多函数聚合与行式结果呈现

本教程详细介绍了如何在pyspark dataframe中对多个列应用多个聚合函数(如`min`和`max`),并将结果以行式结构呈现。通过分步演示,我们展示了如何利用`select`进行初步聚合,并结合`unionbyname`技巧将聚合结果重塑为易于分析的行式格式,适用于需要定制化聚合报告的场景。

在PySpark数据处理中,我们经常需要对DataFrame的多个列执行聚合操作,例如计算每个列的最小值和最大值。虽然PySpark的agg函数能够方便地进行多列多函数聚合,但其默认输出是将所有聚合结果并列在一行中。然而,在某些分析场景下,我们可能需要将不同聚合函数的结果以行(row-wise)的形式展示,即每一行代表一个聚合函数(如最小值、最大值),而列则对应原始DataFrame的列。本教程将详细介绍如何实现这种定制化的行式聚合输出。

1. 问题背景与常见误区

假设我们有一个PySpark DataFrame,并希望计算其中所有数值列的最小值和最大值。一个常见的初步尝试可能是使用列表推导式结合agg函数:

from pyspark.sql import functions as F# 假设 df 是一个 PySpark DataFrame# exprs = [F.min(c).alias(c), F.max(c).alias(c) for c in df.columns]# df2 = df.agg(*exprs)

这种方法虽然可以计算出所有列的最小值和最大值,但其结果会是一个单行DataFrame,其中包含类似 min_col1, max_col1, min_col2, max_col2 等列。这与我们期望的“第一行是所有列的最小值,第二行是所有列的最大值”的行式输出格式不符。

2. 实现行式聚合输出的策略

为了实现行式聚合输出,我们需要采取一种分两步走的策略:

初步聚合所有函数的结果到单行DataFrame: 首先,我们将所有需要的聚合函数(例如,每个列的min和max)应用到DataFrame,生成一个包含所有聚合结果的单行DataFrame。重塑DataFrame为行式输出: 接着,我们将这个单行DataFrame拆分成多个逻辑行,每行代表一个聚合函数的结果,并通过unionByName将它们合并起来。

3. 详细实现步骤

让我们通过一个具体的例子来演示这个过程。

3.1 准备示例数据

首先,创建一个示例PySpark DataFrame:

import operatorfrom pyspark.sql import SparkSessionfrom pyspark.sql import functions as F# 初始化 SparkSessionspark = SparkSession.builder.appName("PySparkMultiAggTutorial").getOrCreate()_data = [    (4, 123, 18, 29),    (8, 5, 26, 187),    (2, 97, 18, 29),]_schema = ['col_1', 'col2', 'col3', 'col_4']df = spark.createDataFrame(_data, _schema)print("原始DataFrame:")df.show()# +-----+----+----+-----+# |col_1|col2|col3|col_4|# +-----+----+----+-----+# |    4| 123|  18|   29|# |    8|   5|  26|  187|# |    2|  97|  18|   29|# +-----+----+----+-----+

3.2 第一步:初步聚合所有函数的结果

我们首先为每个列生成min和max的聚合表达式,并使用df.select()来执行这些聚合。这里使用select而不是agg是因为select可以接受多个表达式作为参数,并直接创建新的列。

喵记多 喵记多

喵记多 – 自带助理的 AI 笔记

喵记多 27 查看详情 喵记多

# 为每个列生成 min 和 max 聚合表达式min_vals = [F.min(c).alias(f'min_{c}') for c in df.columns]max_vals = [F.max(c).alias(f'max_{c}') for c in df.columns]# 将所有聚合表达式合并,并使用 select 得到一个单行 DataFrame# 注意:这里也可以使用 df.agg(*min_vals, *max_vals),效果类似df_aggregated_single_row = df.select(min_vals + max_vals)print("初步聚合后的单行DataFrame:")df_aggregated_single_row.show()# +-------+------+-------+--------+-------+-------+-------+--------+# |min_col_1|min_col2|min_col3|min_col_4|max_col_1|max_col2|max_col3|max_col_4|# +-------+------+-------+--------+-------+-------+-------+--------+# |      2|     5|     18|      29|      8|    123|     26|     187|# +-------+------+-------+--------+-------+-------+-------+--------+

注意事项: 如果df_aggregated_single_row后续会被多次使用,为了优化性能,建议对其进行cache()操作:df_aggregated_single_row.cache()。

3.3 第二步:重塑DataFrame为行式输出

现在我们有了包含所有聚合结果的单行DataFrame (df_aggregated_single_row)。接下来,我们需要将其重塑为期望的行式输出。这涉及到为每种聚合类型(如min和max)创建单独的DataFrame,并添加一个标识聚合类型的列,然后通过unionByName合并它们。

# 1. 创建 min 结果的 DataFrame#    - 添加 'agg_type' 列标识为 'min'#    - 重命名聚合列回原始列名min_cols = operator.add(    [F.lit('min').alias('agg_type')],  # 添加聚合类型标识列    [F.col(f'min_{c}').alias(c) for c in df.columns] # 选择并重命名 min_xxx 列)min_df = df_aggregated_single_row.select(min_cols)# 2. 创建 max 结果的 DataFrame#    - 添加 'agg_type' 列标识为 'max'#    - 重命名聚合列回原始列名max_cols = operator.add(    [F.lit('max').alias('agg_type')],  # 添加聚合类型标识列    [F.col(f'max_{c}').alias(c) for c in df.columns] # 选择并重命名 max_xxx 列)max_df = df_aggregated_single_row.select(max_cols)# 3. 使用 unionByName 合并 min_df 和 max_df#    unionByName 要求两个 DataFrame 具有相同的列名和类型result_df = min_df.unionByName(max_df)print("n最终行式聚合结果:")result_df.show()# +--------+-----+----+----+-----+# |agg_type|col_1|col2|col3|col_4|# +--------+-----+----+----+-----+# |     min|    2|   5|  18|   29|# |     max|    8| 123|  26|  187|# +--------+-----+----+----+-----+

这里的operator.add用于连接两个列表,它与直接使用+的效果相同,例如 [F.lit(‘min’).alias(‘agg_type’)] + [F.col(f’min_{c}’).alias(c) for c in df.columns]。

4. 总结与扩展

这种方法提供了一个灵活且强大的模式,用于在PySpark中实现复杂的行式聚合输出。

核心思想: 将多函数聚合分解为两个阶段:首先进行所有聚合生成单行结果,然后通过选择、重命名和unionByName操作将单行结果重塑为多行。可扩展性: 这种模式可以轻松扩展到更多的聚合函数,例如平均值 (F.avg)、标准差 (F.stddev)、计数 (F.count) 等。只需为每个新的聚合函数重复“生成聚合表达式 -> 创建新的 DataFrame -> 与现有结果 unionByName”的步骤即可。性能考量: 对于大型DataFrame,df_aggregated_single_row.cache() 是一个重要的优化点,可以避免重复计算。通用性: 这种方法不仅限于min和max,任何可以表示为PySpark SQL函数的聚合都可以通过类似的方式处理。

通过掌握这种技巧,开发者可以更灵活地控制PySpark聚合结果的呈现方式,以满足各种数据分析和报告的需求。

以上就是PySpark DataFrame多列多函数聚合与行式结果呈现的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/588173.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
明日地平线2025礼包码怎么领 最新兑换码领取方法
上一篇 2025年11月10日 14:09:30
爱思助手隐私安全小设置!
下一篇 2025年11月10日 14:09:31

相关推荐

  • Java中接口常量和类常量的使用区别

    接口常量默认public static final,用于行为契约但易导致职责模糊;类常量可用不同访问修饰符,更适合封装和维护。现代Java推荐使用专用常量类、枚举、私有静态常量或配置文件管理常量,以提升代码清晰度与可维护性。 Java中接口常量和类常量,核心区别在于它们的定义位置和隐式属性。接口常量…

    2026年9月24日
    000
  • php数据如何实现文件断点续传_php数据大文件上传解决方案

    断点续传通过文件分片、唯一hash标识、服务端记录上传状态实现,前端切片上传并查询已传分片,PHP后端存储分片并在完成后合并,同时提供状态接口支持续传,需注意hash一致性与临时文件清理。 大文件上传在Web开发中是个常见需求,尤其是涉及视频、备份文件或资源包时。PHP本身对文件上传有一定限制,但通…

    2026年9月24日
    000
  • win11终端打不开或者闪退怎么办_win11终端无法打开或闪退修复方法

    先修复快捷方式,再重装应用,接着用SFC和DISM修复系统文件,最后重置终端应用。具体顺序:1、检查WinX菜单快捷方式并重建;2、卸载后从Microsoft Store重装Windows Terminal;3、以管理员身份运行sfc /scannow和DISM命令修复系统;4、在设置中重置终端应用…

    2026年9月24日
    100
  • 360浏览器怎么升级到最新版本 360浏览器版本更新升级操作指南

    建议及时升级360浏览器至最新版本以确保安全与性能,可通过浏览器内置更新、官网手动下载或应用商店三种方式完成升级操作。 如果您发现当前使用的360浏览器功能受限或存在兼容性问题,可能是由于版本过旧导致。为确保浏览安全与性能稳定,建议及时将浏览器升级至最新版本。 本文运行环境:华为Mate 60 Pr…

    2026年9月24日
    100
  • Laravel 表单多动作处理:区分同一路由下的提交操作

    本教程将详细介绍如何在 laravel 应用中,通过一个 html 表单的多个提交按钮触发不同的后端操作,而无需为每个操作创建单独的表单或路由。核心方法是为提交按钮添加 `name` 和 `value` 属性,然后在控制器中根据这些属性的值来判断执行哪种业务逻辑,从而实现如更新用户角色和删除用户等多…

    2026年9月24日
    000
  • Spring Boot 测试中 403 错误排查与安全配置优化

    本文旨在解决 Spring Boot 控制器层测试中常见的 403 Forbidden 错误,特别是当安全配置限制了访问权限时。文章将深入分析 WebSecurityConfig 和 @WithMockUser 的使用,提供两种主要解决方案:通过临时放松安全限制进行测试,以及确保角色/权限配置的正确…

    2026年9月24日
    100
  • Symfony路由如何定义_Symfony框架路由定义定义方法详解

    答案:Symfony中路由通过URL映射控制器,支持注解、YAML、XML和PHP数组定义方式。注解适合快速开发,YAML便于团队维护,路由可设置默认值、正则约束和HTTP方法限制,确保安全与灵活。 在Symfony框架中,路由是将URL映射到控制器的关键机制。通过定义清晰的路由规则,你可以让应用响…

    2026年9月24日
    300
  • MAC怎么把App的语言单独设置成中文或英文_MAC单独设置App语言方法

    可通过终端命令临时设置或修改应用Info.plist文件永久更改macOS单个应用语言,支持中英文切换,不影响系统语言。 如果您希望在 macOS 系统中将某个应用程序的语言单独设置为中文或英文,而不影响系统整体语言,可以通过修改应用的本地化偏好来实现。此方法适用于支持多语言且遵循 macOS 本地…

    2026年9月24日
    000
  • Flyway多数据库与多环境配置:实现测试与生产环境的灵活迁移管理

    本文深入探讨了Flyway在多数据库和多环境场景下的灵活配置策略,旨在解决开发、开发、测试与生产环境数据库迁移的挑战。文章首先分析了测试环境数据库选择的推荐方案,包括使用与生产一致的数据库服务或Testcontainers。随后,详细阐述了Flyway如何通过分离配置文件、编程化配置以及利用占位符来…

    2026年9月24日
    100
  • 猫咪怪盗“亨迪”时间暂停弹幕Roguelike “时间掠夺者亨迪”参展Steam Next Fest

    猫咪怪盗“亨迪”时间暂停弹幕Roguelike “时间掠夺者亨迪”参展Steam Next Fest猫咪怪盗“亨迪”时间暂停弹幕Roguelike “时间掠夺者亨迪”参展Steam Next Fest猫咪怪盗“亨迪”时间暂停弹幕Roguelike “时间掠夺者亨迪”参展Steam Next Fest猫咪怪盗“亨迪”时间暂停弹幕Roguelike “时间掠夺者亨迪”参展Steam Next Fest

    韩国游戏发行商“cometsoft inc.”近日宣布,将携手独立游戏开发者“clockworkcats”携作品《时间掠夺者亨迪》亮相即将开启的“steam next fest”线上游戏盛会。 作为Steam平台每年备受瞩目的大型活动,“Steam Next Fest”致力于连接全球玩家与独立游戏创…

    2026年9月24日 用户投稿
    000
  • mac怎么使用听写功能_mac听写输入开启方法

    首先启用高级听写功能,进入系统设置→键盘→听写,勾选“使用高级听写”并下载语言包;随后可设置快捷键(如双击Fn键)快速启动语音输入;在支持的应用中也可通过菜单栏“编辑→开始听写”直接调用;最后根据需要配置听写语言、自动纠正及连续听写选项以提升识别准确率。 如果您希望在Mac上通过语音输入文字以提高效…

    2026年9月24日
    200
  • Laravel 表单验证失败后保留输入值:最佳实践教程

    本文旨在帮助 Laravel 开发者解决表单验证失败后,如何保留用户已输入数据的问题。我们将深入探讨 withInput() 方法的使用,并提供清晰的代码示例,确保即使在验证失败的情况下,用户体验也能保持流畅。通过本文的学习,你将掌握在 Laravel 中优雅地处理表单验证,并提升应用的可用性。 在…

    2026年9月24日
    100
  • 《明末:渊虚之羽》1.6更新奖励领不了?官方手把手教学来了!

    《明末:渊虚之羽》是一款类魂动作角色扮演游戏,故事发生在巴蜀之地,此时正值黑暗动荡的明末,战事四起,一场神秘的疫病催生了妖怪一般的生物。 今天早些时候我们曾报道,游戏官方发布了1.6版本更新公告,补丁大小约为5.3GB,其中包括豪华版专属内容、免费头饰和性能优化等内容。 官方表示,本次更新“豪华扩展…

    2026年9月24日
    100
  • iSlide预览功能如何开启_iSlide预览功能开启的完整指南

    首先确认iSlide插件已正确安装并显示在PowerPoint功能区,若未显示需重新安装;接着进入“iSlide”选项卡,使用“资源库”中主题或图表分类,将鼠标悬停于缩略图以触发预览;如无反应,检查是否已登录账户且网络畅通,避免防火墙限制;随后更新iSlide至最新版本,卸载旧版后从官网下载安装,并…

    2026年9月24日
    300
  • OriginOS 6 深度体验:当操作系统回归「体验为王」

    OriginOS 6 深度体验:当操作系统回归「体验为王」OriginOS 6 深度体验:当操作系统回归「体验为王」OriginOS 6 深度体验:当操作系统回归「体验为王」OriginOS 6 深度体验:当操作系统回归「体验为王」

    2020 年,智能手机刚刚进入 5g 普及阶段,手机的硬件与软件都迎来了一次迭代浪潮——新形态的需求对操作系统的设计与交互都提出了诸多新的问题,originos 的首个版本,可以看作 vivo对这些问题的回答。 彼时,我曾有机会与 OriginOS 开发团队沟通,正如 OriginOS 的中文名原 …

    2026年9月24日 用户投稿
    100
  • Laravel Livewire 使用指南:构建交互式论坛的最佳实践

    本文旨在指导开发者如何在现有的 Laravel 项目中集成 Livewire,并以构建论坛为例,探讨 Livewire 组件的最佳使用方式和命名规范。文章将深入分析全页面组件和独立组件的选择,并提供实用的代码示例和建议,帮助开发者在保证项目结构清晰的前提下,充分利用 Livewire 的优势,构建高…

    2026年9月24日
    100
  • 基于属性配置动态创建 Spring Boot Bean

    本文介绍了如何在 Spring Boot 应用中基于配置属性的值动态创建 Bean。通过使用 @ConditionalOnProperty 注解,可以根据指定的属性是否存在以及其值来决定是否创建某个 Bean,从而实现灵活的配置和 Bean 的动态加载。本文将提供详细的代码示例和使用说明,帮助开发者…

    2026年9月24日
    100
  • Linux SSH配置文件sshd_config详解

    修改SSH配置可提升安全性与连接体验。1. Port 2222减少攻击;2. ListenAddress指定监听IP;3. Protocol 2禁用不安全的SSH-1;4. PermitRootLogin no禁止root直连;5. PasswordAuthentication no关闭密码登录;6…

    2026年9月24日
    100
  • Laravel Blade中条件隐藏元素的优雅实践

    本文探讨了在Laravel Blade模板中如何高效地实现HTML元素的条件隐藏。针对传统@if-@else语句导致代码冗余的问题,教程提出使用Blade的内联三元运算符在style属性中动态控制display: none,从而避免重复代码,提升模板的可读性和维护性。此外,还将介绍如何利用CSS类和…

    2026年9月24日
    200
  • 三大运营商 eSIM 手机业务全面落地 办理渠道各有侧重

    10 月 14 日消息,日前,中国联通与中国移动正式获准开展 esim 手机运营服务的商用试验,中国电信也同步取得工信部颁发的 esim 手机商用试验许可,这意味着国内三大运营商在 esim 手机业务方面已全面进入实际应用阶段。 中国移动用户可选择前往线下营业厅办理 eSIM 相关业务,也可通过中国…

    2026年9月23日
    200

发表回复

登录后才能评论
关注微信