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

Hive sql 行列转换(行转列,列转行)

在Hive sql应用中会遇到“行转列”和“列转行”的场景,下面介绍其基本使用语法。

1.行转列:

关键字:collect_set() / collect_list()、concat_ws()

1)collect_set()/collect_list():
collect_set( )函数只接受基本数据类型,作用是对参数字段进行去重汇总,返回array类型字段;
collect_list()函数和collect_set( )作用一样,只是前者不去重,后者去重。
2)concat_ws():
concat_ws (separator,字符串A/字段名A,字符串B/字段名B…)是concat的特殊形式,第一个参数是分隔符,分隔符会放到要连接的字符串之间,分隔符可以是字符串,也可以是其他参数。如果分隔符为NULL,则结果为NULL,函数会忽略任何分隔符参数后的 NULL值。但是concat_ws( )不会忽略任何空字符串。(然而会忽略所有的 NULL),如果参数为string类型数组则合并数组内字符串。
例:concat_ws( ‘,’, [ ‘a ‘, ‘b’])–> ‘a,b’
行转列基本语法:
select 分类字段,concat_ws(’,’,collect_set(合并字段)) as 别名 from table_name group 分类字段;

/* 原始数据
name       gender          times
张三         男            唐
李四         男            唐
王五         男            明
赵六         男            明
*/
-- 先用collect_set将列拼接在一起,然后再通过concat_ws进行展开拼接
SELECT a.gender_times,
       concat_ws(';',collect_set(a.name)) name
FROM
  (SELECT name,
          concat(gender, '_','times') gender_times
   FROM hero_info) t
GROUP BY t.gender_times;
/*查询结果
gender_times    name    
男_唐     张三;李四
男_明     王五;赵六

2.列转行

关键字:explode()、split()和LATERAL VIEW

1) split()****:
将一个字符串按照指定字符分割,结果为一个array;
2)explode():
将一列复杂的array或者map拆分为多行,它的参数必须为map或array;
3)lateral view:
lateral view udtf(字段名)表别名/表临时名as列别名/列临时名。lateral view用于和split, explode等UDTF一起使用,它能够将一行数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。lateral view首先为原始表的每行调用UDTF,UTDF会把一行拆分成一或者多行,lateralview再把结果组合,产生一个支持别名表的虚拟表。
列转行基本语法:
select字段,字段别名from table_name lateral view explode(split(拆分字段,分隔符))表别名 as 字段别名;

/*原始数据
province       city
河南           郑州市,开封市,洛阳市
河北           石家庄市,保定市
湖南           长沙市,岳阳市,常德市
*/
-- addr为表名
SELECT province,
       city_n
FROM addr LATERAL VIEW explode (split(city,',')) addr_tmp AS city_n;
/*
-- 查询结果
河南      郑州市
河南      开封市
河南      洛阳市
河北      石家庄市
河北      保定市
湖南      长沙市
湖南      岳阳市
湖南      常德市
*/

最后

深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

小编已加密:aHR0cHM6Ly9kb2NzLnFxLmNvbS9kb2MvRFVrVm9aSGxQZUVsTlkwUnc==出于安全原因,我们把网站通过base64编码了,大家可以通过base64解码把网址获取下来。

相关文章:

  • 【MATLAB教程案例10】使用MATLAB自带的LDPC工具箱实现LDPC编译码误码率仿真
  • 小学数学学习:神奇的走马灯数 142857
  • 【OFDM系列6】MIMO-OFDM系统模型、迫零(ZF)均衡检测和最小均方误差(MMSE)均衡检测原理和公式推导
  • 点云处理简介
  • 跨域问题以及经过网关二次转发重复跨域
  • 自动控制原理9.2---线性系统的可控性与可观测性(上)
  • DOM事件流+阻止冒泡事件+dom包含
  • ZYNQ之GPIO机制
  • 第二章:Qt下载与安装 之 2.2 Qt安装
  • 一种基于堆的链式优先队列实现(使用golang)
  • 【笔记】文献阅读[YOLOV2]-YOLO9000: Better, Faster, Stronger
  • 【JVM基础】方法区
  • Delphi的函数指针传递和调用
  • Java实现简单图书操作系统思路讲解
  • SpringBoot MVC使用Gson,序列化LocalDate,LocalDateTime
  • 【跃迁之路】【519天】程序员高效学习方法论探索系列(实验阶段276-2018.07.09)...
  • Docker 笔记(1):介绍、镜像、容器及其基本操作
  • JavaScript服务器推送技术之 WebSocket
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • overflow: hidden IE7无效
  • Python连接Oracle
  • VUE es6技巧写法(持续更新中~~~)
  • 复杂数据处理
  • 开发基于以太坊智能合约的DApp
  • 容器服务kubernetes弹性伸缩高级用法
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 验证码识别技术——15分钟带你突破各种复杂不定长验证码
  • 用Canvas画一棵二叉树
  • MyCAT水平分库
  • 阿里云IoT边缘计算助力企业零改造实现远程运维 ...
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • #define、const、typedef的差别
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (PyTorch)TCN和RNN/LSTM/GRU结合实现时间序列预测
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (全注解开发)学习Spring-MVC的第三天
  • (转)从零实现3D图像引擎:(8)参数化直线与3D平面函数库
  • **PHP二维数组遍历时同时赋值
  • .NET 2.0中新增的一些TryGet,TryParse等方法
  • .Net 中的反射(动态创建类型实例) - Part.4(转自http://www.tracefact.net/CLR-and-Framework/Reflection-Part4.aspx)...
  • .NetCore项目nginx发布
  • @autowired注解作用_Spring Boot进阶教程——注解大全(建议收藏!)
  • @Transactional类内部访问失效原因详解
  • [AR Foundation] 人脸检测的流程
  • [Ariticle] 厚黑之道 一 小狐狸听故事
  • [BZOJ 3680]吊打XXX(模拟退火)
  • [C++]priority_queue的介绍及模拟实现
  • [ESP32 IDF]web server
  • [HTML]Web前端开发技术12(HTML5、CSS3、JavaScript )——喵喵画网页
  • [LeetCode][面试算法]逻辑闭环的二分查找代码思路
  • [NLP] LlaMa2模型运行在Mac机器
  • [node]Node.js 模块系统