yq pivot 操作符实战:用 yq 实现 RDBMS 风格的行列转置(PIVOT)
yq pivot 操作符实战用 yq 实现 RDBMS 风格的行列转置PIVOT【免费下载链接】yqyq is a portable command-line YAML, JSON, XML, CSV, TOML, HCL and properties processor项目地址: https://gitcode.com/GitHub_Trending/yq/yq本文介绍 yq 内置的pivot操作符——一个对标主流 RDBMS如 SQL Server、OraclePIVOT函数的行列转置能力。它专门处理序列的序列与序列的映射两类数据形态是数据整理、报表预加工和 YAML/JSON 结构转换时的高频工具。读完本文你将掌握pivot的四种典型用法含缺失值补齐规则、它与 SQL PIVOT 的对应关系以及其底层实现原理与测试验证方式。pivot 是什么把行式数据旋转成列式数据在关系型数据库中PIVOT函数将行转换为列把每个实体一行、多个属性多列的表结构旋转为属性为行、实体为列的宽表结构。yq 的pivot操作符定义于 pkg/yqlib/operator_pivot.go在 YAML/JSON 数据上模拟了这一语义输入必须是序列sequence即顶层数据是一组元素数组元素的类型必须统一要么全部是序列要么全部是映射map输出与输入形成转置关系原本每个元素内部的第 N 个子项聚合为输出中第 N 个元素的子项序列。pivot 操作符的语法定义位于 pkg/yqlib/operation.govar pivotOpType operationType{Type: PIVOT, NumArgs: 0, Precedence: 52, Handler: pivotOperator, CheckForPostTraverse: true}由此可以确认两个重要事实pivot是零参数操作符NumArgs: 0直接写yq pivot即可使用同时它开启了PostTraverse后置遍历标记这意味着pivot[]这种带空方括号的写法会被解析为对当前文档中的每一个匹配节点分别执行 pivot对应的解析注册在 pkg/yqlib/lexer_participle.go 的simpleOp(pivot, pivotOpType)。在深入四种使用场景之前先明确 pivot 的基本调用形式。假设输入文件为sample.ymlyq pivot sample.yml # 或者通过标准输入 cat sample.yml | yq pivot场景一Pivot 序列的序列矩阵转置当输入是序列的序列即每个元素都是一个数组时pivot等价于数学上的矩阵转置把第 i 行第 j 列的元素移动到第 j 行第 i 列。给定sample.yml- - foo - bar - baz - - sis - boom - bah执行yq pivot sample.yml输出- - foo - sis - - bar - boom - - baz - bah从源码看这一分支由 pivotSequences 函数 实现它以map[int][]*CandidateNode按列下标收集每一行对应位置的元素随后按列下标顺序重建出新的序列。其效果与行数、列数是否相等无关这正是场景二要讨论的。场景二Pivot 异构序列——缺失值自动补 null实际数据往往并不规整每一行的长度可能不同。此时pivot并不会报错而是遵循缺失值被填充padded为 null的规则补齐。给定sample.yml第二行多了一个blah- - foo - bar - baz - - sis - boom - bah - blah执行yq pivot sample.yml输出- - foo - sis - - bar - boom - - baz - bah - - - blah注意最后一行第一个元素为空null第二个元素是blah。这正是缺失值补 null的直接体现。对应到源码pad 泛型函数 负责把短序列扩充到目标长度填充值由nullNodeFactorycreateScalarNode(nil, )生成——即一个值为 null 的标量节点pivotSequences在收集每列数据时append(pad(e, i, nullNodeFactory), row.Content[j])以及最终输出时pad(m[i], sz, nullNodeFactory)都应用了补齐逻辑保证输出矩阵是规整的矩形。场景三Pivot 序列的映射——行记录转列向量当输入是序列的映射即一个对象数组每行是一个 key-value 映射时pivot将每个键变为输出映射的一个键而该键对应的值变为这一键在所有记录中取值的序列。给定sample.yml- foo: a bar: b baz: c - foo: x bar: y baz: z执行yq pivot sample.yml输出foo: - a - x bar: - b - y baz: - c - z这正是对序列的序列场景的键名版本foo键下的[a, x]就是原数据第一列的转置结果。该分支由 pivotMaps 函数 实现它遍历每行映射的键值对for j : 0; j len(row.Content); j 2步长为 2 是因为 CandidateNode 中映射以键、值、键、值交错存储按键名分组收集值并保持键的首次出现顺序keys : make([]string, 0)仅在键第一次出现时追加因此输出的键顺序与输入中键首次出现的顺序一致。场景四Pivot 异构映射——缺失键同样补 null与场景二对称当各条记录的键不完全一致时某条记录缺少某个键则该键对应的值序列中相应位置会以 null 填充。给定sample.yml第二条记录多了what: ever且没有bar对应的差异可由实际数据灵活构造这里沿用官方示例——注意第二条记录同时包含额外键与全部原有键- foo: a bar: b baz: c - foo: x bar: y baz: z what: ever执行yq pivot sample.yml输出foo: - a - x bar: - b - y baz: - c - z what: - - ever可以看到新增的what键被追加到输出末尾其值序列中第一条记录的位置为 null。这一行为与pivotMaps中的补齐逻辑一致收集第 i 条记录的值时先pad(e, i, nullNodeFactory)最终输出时再pad(m[k], sz, nullNodeFactory)从而保证每个键的值序列长度都等于输入记录总数。pivot 的约束与错误边界pivot并非对任意数据都适用其前置校验逻辑集中在 pivotOperator 函数总结如下约束条件行为输入节点必须是序列!!seq否则报错cannot pivot node of type tag例如对单个标量或映射执行 pivot 会失败序列内所有元素的类型必须一致由getUniqueElementTag校验混合了!!seq与!!map会报错sequence contains elements of X and Y types元素类型只能是序列或映射其他类型如标量序列报错can only pivot elements of !!seq or !!map types序列长度不一致 / 映射键不一致不报错缺失位置自动填充 null另外值得注意的是pivot作用于每个匹配节点。结合CheckForPostTraverse: true你可以使用pivot[]对嵌套在文档中的每个数组分别做转置例如yq pivot[] sample.yml这一对每个匹配项执行 pivot的变体在 pkg/yqlib/operator_pivot_test.go 中有专门测试场景Pivot splat期望输出为按索引拆分后的逐列结果非常适合对多层级数据结构进行批量处理。与 SQL PIVOT 的对应关系为了帮助习惯关系型数据库的读者建立映射这里用一张对照表说明pivot与 SQLPIVOT的语义对应SQL PIVOT 概念yq pivot 对应透视列pivot column的取值序列元素的位置下标场景一/二或映射的键场景三/四聚合函数如 SUM/MAX无聚合直接收集原始值形成序列缺失组合结果为 NULL缺失位置填充 null输入表顶层序列数组核心差异在于SQL 的PIVOT通常需要指定聚合函数对值做归并而 yq 的pivot是纯结构变换——它不做任何聚合只是把数据从行优先重新组织为列优先值原样保留。测试验证官方行为即测试行为本文所有示例并非孤立的文档描述而是与单元测试一一对应。官方测试用例定义于 pkg/yqlib/operator_pivot_test.go通过expressionScenario表驱动结构覆盖了全部四个场景Pivot a sequence of sequencesL7-L13——对应场景一Pivot sequence of heterogeneous sequencesL25-L32——对应场景二副标题即注明Missing values are padded to null.Pivot sequence of mapsL34-L40——对应场景三Pivot sequence of heterogeneous mapsL42-L49——对应场景四同样以Missing values are padded to null.标注。测试中还包含Pivot splat场景验证pivot[]行为且该场景标记了skipDoc: true不进入文档生成流程说明pivot[]是文档之外、由实现额外支持的扩展能力。测试入口TestPivotOperatorScenarios位于同一文件 L52-L57你可以通过以下命令在本仓库中复现全部行为go test ./pkg/yqlib/ -run TestPivotOperatorScenarios -v小结何时该用 pivot一句话总结当你想把一组记录的纵向字段重排为字段为行、记录为列时就用pivot。典型收益场景包括将多行配置每行一个对象转置为按字段聚合的结构便于横向比较把 CSV/JSON 表格数据中的行式记录旋转为列向量供图表或模板直接消费对不规整数据长度不一的行、键不全的记录做规范化补齐得到规整的矩形结构。只需记住两条规则输入必须是元素类型统一的序列遇到缺失一律补 null。结合 operator_pivot.go 的源码与 operator_pivot_test.go 的测试你可以在自己的数据上快速验证并安全地使用这一操作符。【免费下载链接】yqyq is a portable command-line YAML, JSON, XML, CSV, TOML, HCL and properties processor项目地址: https://gitcode.com/GitHub_Trending/yq/yq创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

Roo Code 长期记忆接入指南:用 Hindsight 的 recall/retain 打造跨会话记忆工作流

Roo Code 长期记忆接入指南:用 Hindsight 的 recall/retain 打造跨会话记忆工作流

Roo Code 长期记忆接入指南:用 Hindsight 的 recall/retain 打造跨会话记忆工作流 【免费下载链接】hindsight Hindsight: Agent Memory That Learns 项目地址: https://gitcode.com/GitHub_Trending/hindsight2/hindsight 导读 本文讲解 Hindsight 为 Roo …

2026/9/14 17:47:54 阅读更多 →
IoT-For-Beginners 农场项目实战:在 Raspberry Pi 与虚拟 IoT 设备中使用 X.509 证书连接 Azure IoT Hub

IoT-For-Beginners 农场项目实战:在 Raspberry Pi 与虚拟 IoT 设备中使用 X.509 证书连接 Azure IoT Hub

IoT-For-Beginners 农场项目实战:在 Raspberry Pi 与虚拟 IoT 设备中使用 X.509 证书连接 Azure IoT Hub 【免费下载链接】IoT-For-Beginners 12 Weeks, 24 Lessons, IoT for All! 项目地址: https://gitcode.com/GitHub_Trending/io/IoT-For-Beginners 本文…

2026/9/14 17:47:54 阅读更多 →
Cesium 中的 KHR_materials_clearcoat 扩展解析:以 BoxClearcoat 测试模型为例

Cesium 中的 KHR_materials_clearcoat 扩展解析:以 BoxClearcoat 测试模型为例

Cesium 中的 KHR_materials_clearcoat 扩展解析:以 BoxClearcoat 测试模型为例 【免费下载链接】cesium An open-source JavaScript library for world-class 3D globes and maps :earth_americas: 项目地址: https://gitcode.com/GitHub_Trending/ce/cesium …

2026/9/14 17:47:54 阅读更多 →

最新新闻

Agent技术应用发展与行业落地实践指南

Agent技术应用发展与行业落地实践指南

读研/做科研,最忌讳“囤工具”——下载一堆软件,每款都浅尝辄止,反而浪费时间、拖慢效率。 这篇不贪多,只推荐4款「文献-数据-写作」全流程核心工具,每款都精细化拆解操作步骤、适配场景、避坑细节,甚至补…

2026/9/14 18:24:15 阅读更多 →
AI论文写作技巧与前沿研究方向梳理指南

AI论文写作技巧与前沿研究方向梳理指南

读研/做科研,最忌讳“囤工具”——下载一堆软件,每款都浅尝辄止,反而浪费时间、拖慢效率。 这篇不贪多,只推荐4款「文献-数据-写作」全流程核心工具,每款都精细化拆解操作步骤、适配场景、避坑细节,甚至补…

2026/9/14 18:24:14 阅读更多 →
AI写论文实用指南:高效创作技巧与规范合规要点解析

AI写论文实用指南:高效创作技巧与规范合规要点解析

读研/做科研,最忌讳“囤工具”——下载一堆软件,每款都浅尝辄止,反而浪费时间、拖慢效率。 这篇不贪多,只推荐4款「文献-数据-写作」全流程核心工具,每款都精细化拆解操作步骤、适配场景、避坑细节,甚至补…

2026/9/14 18:24:14 阅读更多 →
大语言模型的技术发展脉络与行业应用前景解析

大语言模型的技术发展脉络与行业应用前景解析

读研/做科研,最忌讳“囤工具”——下载一堆软件,每款都浅尝辄止,反而浪费时间、拖慢效率。 这篇不贪多,只推荐4款「文献-数据-写作」全流程核心工具,每款都精细化拆解操作步骤、适配场景、避坑细节,甚至补…

2026/9/14 18:24:14 阅读更多 →
高效降重实用技巧合集 专业靠谱的内容降重方法全解析

高效降重实用技巧合集 专业靠谱的内容降重方法全解析

读研/做科研,最忌讳“囤工具”——下载一堆软件,每款都浅尝辄止,反而浪费时间、拖慢效率。 这篇不贪多,只推荐4款「文献-数据-写作」全流程核心工具,每款都精细化拆解操作步骤、适配场景、避坑细节,甚至补…

2026/9/14 18:24:14 阅读更多 →
Bokeh 与 Jupyter 深度集成指南:从 Notebook 内联输出到 JupyterHub 与 IPyWidgets

Bokeh 与 Jupyter 深度集成指南:从 Notebook 内联输出到 JupyterHub 与 IPyWidgets

Bokeh 与 Jupyter 深度集成指南:从 Notebook 内联输出到 JupyterHub 与 IPyWidgets 【免费下载链接】bokeh Interactive Data Visualization in the browser, from Python 项目地址: https://gitcode.com/GitHub_Trending/bo/bokeh 本指南基于 Bokeh 官方用户…

2026/9/14 18:23:14 阅读更多 →

日新闻

AI音乐侵权案中的测试工程与版权保护技术

AI音乐侵权案中的测试工程与版权保护技术

1. 项目概述:当测试工程师遇上AI音乐侵权案去年夏天,我作为技术顾问参与了一起特殊的著作权纠纷案——某音乐平台AI作曲功能被指控批量侵权。这起案件的特殊性在于:原告方并非传统音乐人,而是一家拥有百万级曲库的数字音乐发行商&…

2026/9/14 0:00:26 阅读更多 →
嵌入式面试I2C与SPI深度解析:从协议到量产调试

嵌入式面试I2C与SPI深度解析:从协议到量产调试

1. 这份“高频知识点洞察”到底是什么,又为什么值得你花时间细读? 如果你最近在刷嵌入式开发岗位的招聘JD,或者正坐在工位上改第7版简历,又或者刚被面试官一句“讲讲I2C和SPI的区别”问得手心冒汗——那你不是一个人。过去两年我带…

2026/9/14 0:00:26 阅读更多 →
51单片机开环控制磁阻传感器的硬件匹配与代码实现

51单片机开环控制磁阻传感器的硬件匹配与代码实现

简介:本资源是一份面向嵌入式初学者与单片机课程实践者的51单片机开关磁阻电机(SRM)开环控制教学方案,聚焦磁阻位置检测、固定时序驱动与基础状态可视化。资源包含1个C语言主程序文件(zhuang600.c)实现电机…

2026/9/14 0:00:26 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/14 5:45:49 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/14 0:52:26 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/14 0:06:41 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/14 17:35:10 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/14 16:59:29 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/14 5:45:14 阅读更多 →