当前位置: 首页 > news >正文

hive sql行转列,列转行sql的实例

在 Hive SQL 中,行转列和列转行是常见的数据转换操作。以下是详细说明和示例:

一、行转列(多行转多列)

场景:将同一分组下的多行数据合并为单行,不同值转为新列(如学生各科成绩横向展示)。

数据示例(student_scores):

student_idsubjectscore
1Math90
1English85
2Math92

目标(每个学生一行,科目成绩转为列):

student_idMathEnglish
19085
292NULL

SQL 实现

SELECT student_id, MAX(CASE WHEN subject = 'Math' THEN score END) AS Math, MAX(CASE WHEN subject = 'English' THEN score END) AS English FROM student_scores GROUP BY student_id;

关键点

  1. 使用CASE WHEN按条件生成新列
  2. 用聚合函数(如MAX/MIN/SUM)确保单行输出
  3. 必须配合GROUP BY分组字段

二、列转行(多列转多行)

场景:将单行的多列数据拆分为多行(如将横向科目成绩转为纵向记录)。

数据示例(student_scores_wide):

student_idMathEnglish
19085
292NULL

目标(恢复为行式存储):

student_idsubjectscore
1Math90
1English85
2Math92
2EnglishNULL

SQL 实现

SELECT student_id, 'Math' AS subject, Math AS score FROM student_scores_wide UNION ALL SELECT student_id, 'English' AS subject, English AS score FROM student_scores_wide;

优化方案(使用LATERAL VIEW explode(),Hive 特有):

SELECT student_id, subject, score FROM student_scores_wide LATERAL VIEW explode( map( -- 构建科目-分数的键值对 'Math', Math, 'English', English ) ) subjects AS subject, score;

关键点

  1. UNION ALL适合列数量固定的场景
  2. LATERAL VIEW + explode(map)动态处理多列
  3. 注意处理NULL值(Hive 中NULL会正常保留)

三、高级用法:动态行列转换

当列名不固定时(如新增科目),需结合 Hive 动态 SQL 或预处理:

  1. 行转列动态化
    使用collect_list+ 拼接字符串,再通过 UDF 解析(较复杂,通常需借助外部脚本生成 SQL)。
  2. 列转行动态化
    通过 Hive 元数据获取列名,动态生成UNION ALL语句(示例略,需依赖 Hive 变量或编程接口)。

总结对比

操作核心方法适用场景
行转列CASE WHEN+ 聚合函数 +GROUP BY固定列名,聚合统计
列转行UNION ALLLATERAL VIEW explode列数量少或需动态处理

提示:Hive 3.0+ 支持LATERAL VIEW inline(array_of_structs),但需先构造结构体数组。实际使用时请根据数据规模和复杂度选择合适方案。

http://www.cnnetsun.cn/news/420303.html

相关文章:

  • 导师严选10个AI论文网站,助你搞定本科生毕业论文!
  • 西门子博途PLC程序开发,V17、V16、V15.1版本实战
  • 语音合成硬件要求指南:GPU显存与算力匹配建议
  • 【珍藏干货】大模型退潮,AI Agent崛起:2026年AI技术变革与程序员必学方向
  • 语音合成可用于车载导航?低延迟场景优化建议
  • PHP错误日志满天飞?一文搞定集中存储、检索与告警体系搭建
  • pythonBBS论坛系统论文w076f--(flask django Pycharm)
  • SPELL_EFFECT_SUMMON (28) 用法详解
  • 法术链接(spell_linked_spell)
  • [精品]基于微信小程序的线上水果店系统 UniApp
  • 语音合成参数调优实验记录:寻找最优配置组合
  • [精品]基于微信小程序的健康饮食小程序 UniApp
  • 【真香警告】别再只做“调包侠“了!这个开源项目让你从大模型调用者蜕变为智能体架构师!
  • 为什么你的PHP缓存总不生效?边缘计算环境下的3大陷阱揭秘
  • 【PHP文件传输黑科技】:如何精准获取GB级文件上传实时进度百分比
  • PHP 8.7兼容性深度剖析(仅限资深工程师掌握的4种检测技巧)
  • 【PHP开发者必看】如何用Swoole+WebSocket打造毫秒级消息推送?
  • 【高性能PHP应用构建】:基于边缘计算的缓存机制全解析
  • WebSocket推送延迟高?PHP性能优化的8个关键步骤,你掌握了吗?
  • 如何构建设备运维的智能预警体系来避免非计划停机?
  • GLM-TTS是否支持JavaScript前端交互?WebAPI调用示例
  • 边缘节点缓存失效怎么办?PHP开发者必须了解的4种容灾方案
  • GLM-TTS与Markdown结合:将文档内容自动转为语音讲解
  • 【PHP Redis分布式锁实战指南】:从原理到应用,彻底掌握高并发场景下的锁机制
  • 计算机毕业设计springboot程序设计类辅助教学平台 基于SpringBoot的编程课程在线教学与训练系统 SpringBoot+Vue 程序设计类智慧学习管理平台
  • 揭秘PHP如何实现区块链账户生成与管理:5步构建私钥安全体系
  • 【收藏学习】BERT模型全解析:从原理到应用的NLP革命
  • 收藏!AI不是抢饭碗,是给程序员/小白的时代红利|大模型学习必看
  • 如何上传JSONL任务文件?批量处理语音合成全流程演示
  • GLM-TTS能否集成MathType公式朗读?学术场景应用展望