HQL中实现行列转换
其实并不用纠结哪个是行转列、哪个是列转行,明白二者之间的需求即可
在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_timesFROM 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;
/*
-- 查询结果
河南      郑州市
河南      开封市
河南      洛阳市
河北      石家庄市
河北      保定市
湖南      长沙市
湖南      岳阳市
湖南      常德市
*/

下面再用别的例子进行阐述一下
行转列
数据、建表如下:
张三 白羊座 A
李四 射手座 A
王五 白羊座 B
刘六 白羊座 A
诸葛七 射手座 A
小明 白羊座 B

create table person_info(
name string,
constellation string,
blood_type string)
row format delimited fields terminated by "\t";

需求如下:
把星座和血型一样的人归类到一起

射手座,A 大海|凤姐
白羊座,A 张三|刘六
白羊座,B 王五|小明

分析:

先用concat_ws函数将将星座和血型用“,”连接
在根据连接好的星座和血型group by
用collect_set函数对name聚合,
用concat_ws函数对聚合后的name用“|”分割
实现如下:

SELECT
t1.c_b,
CONCAT_WS("|",collect_set(t1.name))
FROM (
SELECT
NAME,
CONCAT_WS(',',constellation,blood_type) c_b
FROM person_info
)t1
GROUP BY t1.c_b

列转行
数据、建表如下:
《疑犯追踪》 悬疑,动作,科幻,剧情
《Lie to me》 悬疑,警匪,动作,心理,剧情
《战狼 2》 战争,动作,灾难

create table movie_info(
movie string,
category string)
row format delimited fields terminated by "\t";

需求如下:
将电影分类中的数组数据展开

《疑犯追踪》 悬疑
《疑犯追踪》 动作
《疑犯追踪》 科幻
《疑犯追踪》 剧情
《Lie to me》 悬疑
《Lie to me》 警匪
《Lie to me》 动作
《Lie to me》 心理
《Lie to me》 剧情
《战狼 2》 战争
《战狼 2》 动作
《战狼 2》 灾难

分析:

先用split函数将category根据“,”分割成数组
lateral view结合explode函数进行炸裂后的侧写
实现如下:

SELECT
movie,
category_name
FROM
movie_info
lateral VIEW
explode(split(category,",")) movie_info_tmp AS category_name;

Hive ,Hsql行转列、列转行实现相关推荐

  1. hive 时间转字符串_07697.0.3如何在Kerberos环境下用Ranger完成对Hive的行过滤及列脱敏...

    文档编写目的 本篇文章主要介绍如何在CDP DC7.0.3集群中使用Ranger在Hive中进行行过滤及列脱敏,行级别的过滤相当于一个强制性的where子句,例如在订单表中,员工仅被允许查看自己所在地 ...

  2. Hive(行转列 列转行)

    Hive(行转列 列转行) 行转列 行专列常用的几种方式有 collect_list collect_set 举例说明 原数据 sql SELECT concat_ws("|",c ...

  3. SQL Server 行转列,列转行。多行转成一列

    一.多行转成一列(并以","隔开) 表名:A 表数据: 想要的查询结果: 查询语句: SELECT name ,value = ( STUFF(( SELECT ',' + val ...

  4. sqlserver中某列转成以逗号连接的字符串及逆转、数据行转列列转行

    Sql Server 列转逗号隔开的字符串 和 逆转 https://www.cnblogs.com/duanyuerui/p/7567692.html Sql server 中将数据行转列列转行(一 ...

  5. Hive sql 行转列

    Hive sql 行转列 简单的行转列 业务场景:想统计不同商品的销量 进阶的行转列 业务场景:统计出不同商品的下单量 简单的行转列 业务场景:想统计不同商品的销量 原始订单数据: order_id( ...

  6. 【Excel】行转列+列转行

    行转列举例: 拷贝要转成列的行 选择一个空格,右键 选择性粘贴,并勾选 转置 结果如下: 多行转多列 以及多列转多行都是同样的操作

  7. Oracle 多行变一列的方法

    多行变一列的方法有很多,觉得这个第一眼看懂了当时就用的这个办法. 情况是这样的.以下数据前几列是一样的,需要把VAT_VALUE_CHAR 的值放在同一行上. SELECT * FROM ps_vat ...

  8. oracle 行转列后列名,Oracle 多行转多列,列值转为列名

    前段时间做调查问卷,客户创建自定义问卷内容,包括题目和选项内容; 之后需要导出问卷明细,,,,麻烦来咯 于是到网上到处搜索,没有直接结果;于是又找各种相似的,,终于功夫不负有心人 然后最终自己写出来了 ...

  9. oracle一列多行转一行多列表示,Oracle 多行转多列,列值转为列名

    前段时间做调查问卷,客户创建自定义问卷内容,包括题目和选项内容; 之后需要导出问卷明细,,,,麻烦来咯 于是到网上到处搜索,没有直接结果;于是又找各种相似的,,终于功夫不负有心人 然后最终自己写出来了 ...

最新文章

  1. 数据结构—顺序表的插入算法
  2. 怎么将arcgis新建工具条如何保存_ArcGIS中寻找最短路径的方法
  3. beautifulsoup_Python爬虫-BeautifulSoup
  4. 查询排序_Mysql在排序和查询时不使用索引的情况
  5. 前端学习(2244):计算器显示问题
  6. 对内存重叠的深入认识
  7. Java 复习笔记 异常Exception
  8. java 托盘开发_java托盘开发界面记录
  9. 可拖动jquery插件
  10. pytorch中的tensor以numpy形式进行输出保存
  11. minitab学习系列(1)--二项式分布过程能力分析
  12. python二级题库(百分之九十原题) 刷题软件推荐
  13. win10激活--以专业版(professional)为例
  14. Java-学习-喜欢-品牌:互联网公司成为动物园,拟人化品牌形象真的那么有意思?...
  15. STM32F7--->SDRAM
  16. 少儿Python视频课程A级简介
  17. 记录学习画漫画的过程~~2014.7.10(人物头像)
  18. iOS7下的drawInRect的新方法drawInRect:withAttributes:使用
  19. Xshell如何连接虚拟机
  20. 解决 fatal: unable to access ‘https://github.com/qweertu/git-demo.git/‘: error setting certificate...

热门文章

  1. UCloud优刻得创始人季昕华:深耕云计算,做隐私计算赛道的“奇袭军”
  2. Phonics 自然拼读法 c/k,e,h,r,m,d Teacher:Lamb
  3. Vitamio 依赖导入 步骤
  4. 《Python程序设计与算法基础教程(第二版)》江红 余青松 全部章节的课后习题,上机实践,课后答案,案例研究
  5. mysql外键约束案例_详解MySQL中的外键约束问题
  6. Beta阶段冲刺-1
  7. 8乘8led点阵显示数字_基于51单片机的8乘8LED点阵显示屏的设计
  8. 关于1M=1024K 和1M=1000K的主要使用区别
  9. 针对刀具磨损的日志读取的曲线分析(一维高斯滤波及波形拟合)
  10. 去广告神器(Adblock Plus离线安装)