Apache Beam Python Kata 实战:使用 CombineGlobally 与简单函数实现全局求和
【免费下载链接】beamApache Beam is a unified programming model for Batch and Streaming data processing.项目地址https://gitcode.com/gh_mirrors/beam18/beam点击查看免费下载Apache Beam 的 Combine 系列转换用于把数据集合中的元素或值聚合成一个结果。本篇文章以 Beam 官方学习仓库learning/katas中 Combine - Simple Function 这一道 Kata 练习为线索从任务要求、完整参考实现、单元测试验证到CombineGlobally的底层执行原理带你彻底掌握用简单函数做全局聚合这一最基础的 Combine 用法。读完本文你将能够独立编写一个符合 Beam 约定可交换、可结合的简单聚合函数并正确接入CombineGlobally转换完成全局求和。任务背景Katas 系列与 Combine 课程定位Apache Beam 官方在仓库中维护了一套面向不同语言的编程练习Kata用于通过题目 测试 提示的方式逐级学习 Beam 核心概念。Python 版本的练习位于 learning/katas/python其中 Combine 相关的课程位于 learning/katas/python/Core Transforms/Combine由三节课构成见 lesson-info.yamlSimple Function用简单函数完成全局聚合本篇文章主题CombineFn通过继承CombineFn实现更复杂的聚合如平均值需要自定义累加器Combine PerKey对按 Key 分组的 PCollection 做按键聚合。三者由浅入深简单函数适合求和这类轻量场景当聚合需要复杂累加器、前后处理或输出类型变化时应使用CombineFn而CombinePerKey则是GroupByKey 合并模式的等价替代。本道练习的任务说明位于 learning/katas/python/Core Transforms/Combine/Simple Function/task.md任务是使用CombineGlobally实现对数字序列的求和。核心概念Combine 转换与简单函数任务文档明确指出 Combine 的定义与关键约束Combine 是 Beam 中用于把数据中元素或值的集合合并起来的转换。当你应用 Combine 转换时必须提供包含合并逻辑的函数。该合并函数应当是**可交换commutative且可结合associative**的因为该函数不一定会对某个键下的所有值恰好调用一次。为什么强调可交换、可结合原因在于分布式执行模型输入数据包括值集合可能被分布到多个 worker 上合并函数可能被多次调用每次只对值集合的某个子集做部分合并最后再把部分结果逐级合并成最终结果。因此可结合性保证无论按什么分组顺序合并最终结果一致如(ab)c a(bc)可交换性保证无论子集划分如何结果一致如ab ba。求和、求最大值、最小值、计数这类简单组合操作天然满足上述性质因此通常可以直接实现为一个简单函数而不必动用CombineFn的完整类体系。参考实现定义一个求和函数并接入 CombineGlobally本练习的完整参考实现位于 learning/katas/python/Core Transforms/Combine/Simple Function/task.pyimport apache_beam as beam def sum(numbers): total 0 for num in numbers: total num return total with beam.Pipeline() as p: (p | beam.Create([1, 2, 3, 4, 5]) | beam.CombineGlobally(sum) | beam.LogElements())对照练习结构逐段拆解导入 SDKimport apache_beam as beam。仓库内 Python SDK 的源码根目录在 sdks/python/apache_beamCombineGlobally定义于 sdks/python/apache_beam/transforms/core.py。定义简单函数sum(numbers)接收一个可迭代的值集合返回它们的总和。注意这里传入的numbers是一次部分合并的输入子集——这正是简单函数形态输入是集合、输出是单个值函数内部完成归约逻辑。构建流水线with beam.Pipeline() as p:是标准写法配合with语句在退出时自动等待执行完成。串联三个转换beam.Create([1, 2, 3, 4, 5])创建包含 5 个元素的 PCollectionbeam.CombineGlobally(sum)把整个 PCollection 归约为单个值 15beam.LogElements()把结果打印到日志/控制台。运行该脚本后输出为15。从源码结构看CombineGlobally的expand实现sdks/python/apache_beam/transforms/core.py会先把每个元素包装成键为None的 KV 对_KeyWithNone再通过CombinePerKey完成归约最后去掉键取出合并值。也就是说全局合并在底层被复用为按单一空键做 PerKey 合并这解释了为何全局聚合依然可以借力分布式、分阶段的合并策略。参数说明CombineGlobally 的关键行为依据 sdks/python/apache_beam/transforms/core.py 中CombineGlobally的类文档其构造函数签名为CombineGlobally(fn, *args, **kwargs)fn一个CombineFn对象或一个可被CallableWrapperCombineFn包装的可调用对象如本练习中的sum。传入既非CombineFn又不可调用的对象时构造器会抛出TypeError见 core.py#L2608-L2611。*args / **kwargs透传给CombineFn的位置与关键字参数。源码注释说明其中若出现PValue参数会被识别为旁路输入side input在执行时以实际值替换到原位置。除了基本签名CombineGlobally还提供几个常用派生方法方法行为with_fanout(fanout)为热键hot key场景设置扇出因子用于缓解数据倾斜见 core.py#L2640-L2641without_defaults()输入为空时输出空 PCollection而不是输出默认值见 core.py#L2646-L2647as_singleton_view()把结果作为单例旁路输入视图使用见 core.py#L2649-L2650其中默认值机制值得注意CombineGlobally默认has_defaults True当输入为空时会输出 CombineFn 作用于空输入的默认结果例如sum([])得到 0。但在非全局窗口非 GlobalWindows的流式场景下为空窗口注入默认值会引发ValueError或日志告警见 core.py#L2690-L2706此时官方建议改用without_defaults()或as_singleton_view()。这一点在编写生产级流式管道时务必留意。验证方式单元测试与运行环境本练习配套了自动化测试 learning/katas/python/Core Transforms/Combine/Simple Function/tests/test_task.py逻辑非常直观test_not_empty通过test_is_not_empty()检查task.py非空test_output通过get_file_output(pathtask.py)实际执行脚本断言输出中包含字符串15即 12345 的总和。其中test_is_not_empty与get_file_output两个辅助函数定义于 learning/katas/python/test_helper.pyget_file_output使用subprocess启动新的 Python 进程执行目标脚本并捕获其标准输出逐行拆分后返回字符串列表——这也是测试中assertIn(answer, output)能直接匹配的原因。本地运行方式在该练习目录下直接执行python task.py即可看到输出15或者把test_helper.py与本测试文件放在一起后执行python test_task.py完成验证。Katas 项目环境搭建按 learning/katas/python/README.md 的说明使用 PyCharm Education或安装 EduTools 插件的 PyCharm新建项目并选择learning/katas/python目录作为项目根配置 Python 解释器后即可在 Course 视图下逐题作答、实时得到测试反馈。从简单函数到 CombineFn何时需要升级任务文档中的提示已经划清了边界简单求和用简单函数即可而复杂的组合操作例如求平均值累加类型与输入/输出类型不同或需要额外的预处理/后处理、需要感知 Key则要求创建CombineFn的子类。相邻课程 learning/katas/python/Core Transforms/Combine/CombineFn/task.md 正是以此为练习目标通过重写create_accumulator、add_input、merge_accumulators、extract_output等钩子方法来实现平均值等非平凡聚合而 learning/katas/python/Core Transforms/Combine/Combine PerKey/task.md 则讲解了对键控 PCollection 的按 Key 聚合。因此在实际项目中可以遵循这样的选择路径聚合逻辑简单求和、计数、最大/最小且不需要感知 Key → 直接传一个简单函数给CombineGlobally聚合需要独立于输入输出类型的累加器、前后处理或输出类型会变化 → 继承CombineFn需要按键合并如每位玩家的得分总和→ 使用CombinePerKey。小结Combine 是 Beam 中对元素/值集合做归约的核心转换合并函数必须可交换且可结合以适配分布式、多阶段的部分合并执行模型。求和这类简单操作可以直接实现为接收集合、返回单值的简单函数并通过beam.CombineGlobally(sum)完成全局聚合参考实现见 Simple Function/task.py。CombineGlobally底层将输入包装为单一空键后复用CombinePerKey完成归约core.py#L2652-L2671并提供with_fanout、without_defaults、as_singleton_view等行为控制方法。配套单元测试tests/test_task.py通过执行脚本并断言输出15来校验练习结果可直接本地复现。当聚合复杂度超出简单函数能力范围时应升级到CombineFn子类或改用CombinePerKey三节课共同构成完整的 Combine 学习路径见 lesson-info.yaml。赞分享【免费下载链接】beamApache Beam is a unified programming model for Batch and Streaming data processing.项目地址https://gitcode.com/gh_mirrors/beam18/beam点击查看免费下载相关推荐Apache Beam Python Katas 实战用简单函数实现 CombineGlobally 求和Simple FunctionApache Beam Python Katas 实战用简单函数实现 CombineGlobally 求和Simple Function 导读 本指南以大数据批处理流处理数据工程Apache Beam Go SDK Kata 实战用 Combine 简单函数实现求和Apache Beam Go SDK Kata 实战用 Combine 简单函数实现求和 Combine 是 Apache Beam 中用于把集合中的元素或值Apache Beam Java Kata 实战使用 Combine.globally 与 SerializableFunction 实现全局求和Apache Beam Java Kata 实战使用 Combine.globally 与 SerializableFunction 实现全局求和 导读 本文大数据批处理流处理数据工程上一篇思源宋体TTF7种字体样式的终极免费方案让你告别字体烦恼下一篇Microsoft Graph 类型层次Type Hierarchy模式用子类型建模多态资源集合创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

基于Unet的LITS肝肿瘤分割实战:从数据预处理到模型训练验证

基于Unet的LITS肝肿瘤分割实战:从数据预处理到模型训练验证

简介:这是一份基于Unet的LITS肝肿瘤分割项目资源包,面向医学图像分割方向的开发者与研究者。内容涵盖完整数据集、Python训练/测试代码与已训练10个epochs的结果文件,网络在全局像素准确度达0.988、miou为0.838,若加大训练轮数性能…

2026/10/9 15:22:00 阅读更多 →
高保真训练场:让强化学习策略从仿真顺利迁移到真实机器人

高保真训练场:让强化学习策略从仿真顺利迁移到真实机器人

做机器人和自主无人系统的强化学习,有个绕不开的现实:算法在仿真环境里跑得飞起,放到真实设备上却像换了脑子。我第一次被这问题折磨,是用一个带视觉的机械臂抓取项目,算法在仿真里成功率已经能到九成,真机…

2026/10/9 15:21:58 阅读更多 →
全国县级shp文件处理全攻略:从坐标系体检到重投影避坑指南

全国县级shp文件处理全攻略:从坐标系体检到重投影避坑指南

简介:全国县级行政区划shp文件是GIS领域常用的基础地理数据,面向地理信息专业学生、规划人员及数据分析师,用于获取中国县级行政单元的精确边界。Shapefile基于Esri标准格式,由几何、属性、索引三类子文件协同工作,本资…

2026/10/9 15:20:57 阅读更多 →

最新新闻

PHP的PDO错误与错误处理

PHP的PDO错误与错误处理

前言 PDO 提供了三种错误处理策略,用 PDO::ATTR_ERRMODE 属性切换。听起来是个小配置项,实际上它是本章最容易踩坑的地方,原因在于默认值变过。 在 PHP 8.0.0 之前,默认模式是 PDO::ERRMODE_SILENT——出错了什么都不说&#xff0…

2026/10/9 17:10:53 阅读更多 →
Codex智能体实战:从代码生成到多场景自动化生产

Codex智能体实战:从代码生成到多场景自动化生产

我老早就想写这么一篇东西了。这两年“超级个体”这个概念被讲烂了,但真正能把一个人当一支团队用的,核心不是会多少工具,而是能不能把重复劳动交给系统去跑、自己只盯着关键节点。Codex这名字一出来,很多人以为它就是个“更强的编…

2026/10/9 17:10:53 阅读更多 →
代码生成器性能优化实战:从40秒到4秒的调优全解析

代码生成器性能优化实战:从40秒到4秒的调优全解析

我接手公司内部那个代码生成器的时候,它单次生成300张表的全套CRUD代码要跑40多秒。这个时长说慢不慢,但配合上每天几十次的生成操作,整个研发团队的耐心基本被磨没了。后来我花了两周时间做优化,把耗时压到了4秒以内。今天这篇就…

2026/10/9 17:10:53 阅读更多 →
UPC条形码校验码计算全解析:Excel公式与Bartender配置

UPC条形码校验码计算全解析:Excel公式与Bartender配置

1. 从一个超市扫码枪说起:UPC 条形码到底是怎么回事如果你在零售、仓储、电商或者制造业待过,大概率都跟条形码打过交道。收银台那一声“嘀”,背后其实就是 UPC 或者 EAN 这套编码体系在工作。UPC 全称 Universal Product Code,中…

2026/10/9 17:10:53 阅读更多 →
计算机考研复试专业课:从问题清单到答题框架的备考方法

计算机考研复试专业课:从问题清单到答题框架的备考方法

简介:杭州电子科技大学计算机考研复试专业课问题整理为一份PDF文档,面向报考杭电计算机的考生,用于快速梳理数据结构、计算机组成原理、操作系统、计算机网络、数据库、编译原理、软件工程等七门科目的高频考点。压缩包内共1个文件&#xff0…

2026/10/9 17:10:53 阅读更多 →
漫画角色跳出分镜,就算剧情战斗成立了吗?实测6个分镜状态节点

漫画角色跳出分镜,就算剧情战斗成立了吗?实测6个分镜状态节点

很多“一句话把图片或故事生成游戏”的演示,都会出现一个很有吸引力的镜头:漫画书打开,角色从分镜中跳出来,随后与怪物交战。这个画面可以证明题材方向和视觉转场已经形成,却不能直接证明它是一段能够重复游玩的剧情战…

2026/10/9 17:09:46 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →