Hive SQL行列转换
一、行转列
1.1、行转列需要用到的函数
CONCAT(string A/col, string B/col…):返回输入字符串连接后的结果,支持任意个输入字符串。
例如: concat( aa, ‘:’, bb) 就相当于把aa列和bb列用冒号连接起来了,aa:bb。
CONCAT_WS(separator, str1, str2,…):CONCAT_WS() 代表 CONCAT With Separator ,是CONCAT()的特殊形式。第一个参数是其它参数的分隔符。分隔符的位置放在要连接的两个字符串之间。分隔符可以是一个字符串,也可以是其它参数。如果分隔符为 NULL,则结果为 NULL。函数会忽略任何分隔符参数后的 NULL 值。但是CONCAT_WS()不会忽略任何空字符串。 (然而会忽略所有的 NULL)。
COLLECT_SET(col):函数只接受基本数据类型,它的主要作用是将某字段的值进行去重汇总,产生array类型字段。
1.2、真题实战
1.2.1、需求
user_name province city
张三 广东 广州
李四 河南 开封
王二 广东 深圳
小亮 河南 开封
小明 广东 深圳
如上面表格是hive表user_info里的数据,现在想把省份和城市一样的用户放到一起,想要的结果如下:
place users
广东,广州 张三
广东,深圳 王二|小明
河南,开封 李四|小亮
题目分析:
SELECTt.place AS place,CONCAT_WS('|', COLLECT_SET(t.user_name)) AS users
FROM(SELECTuser_name,CONCAT(province, ',', city) AS placeFROMuser_info) t
GROUP BYt.place;
二、列转行
2.1、列转行需要用到的函数
EXPLODE(col):将hive某列中复杂的array或者map结构拆分成多行。
LATERAL VIEW:侧视图常和UDTF函数一起使用。
用法:LATERAL VIEW udtf(expression) tableAlias AS columnAlias
解释:其实LATERAL VIEW udtf(expression) tableAlias相当于一个虚拟表,一般放在原表下面使用,效果是和原表做笛卡尔积关联,可以多重使用。常常和和split, explode等UDTF一起使用,它能够将一列数据拆成多行数据,在此基础上可以对拆分后的数据进行聚合。
列转行函数不容易弄懂,下面我们通过题目实战进行理解。
2.2、真题实战
2.2.1 、需求
user_name hobbies
张三 看电影,玩游戏,看小说
李四 看电影,看小说
王二 跑步,打篮球
如上面表格是咱们hive表user_hobby_info里的数据,现在想把每个用户的爱好分开,也就是一行变为多列,想要的结果如下:
user_name hobby
张三 看电影
张三 玩游戏
张三 李四|小亮
李四 看电影
李四 看小说
王二 跑步
王二 打篮球
题目分析:
select user_name,hobby
from
user_hobby_info LATERAL VIEW EXPLODE(SPLITE(hobbies,',')) tmp_hobbies as hobby;
三、行转列
3.1、将JSON的key值变成表的列名
Id |
key |
value |
1 |
address |
山西省 |
1 |
School |
**小学 |
2 |
Address |
上海市 |
转换成一张宽表:
Id |
address |
school |
1 |
山西省 |
**小学 |
2 |
上海市 |
Null |
下面示例:如果非group by 列是int类型,可以使用sum、max等聚合函数。
select id,COLLECT_SET(case when key = 'address' then value end) as address,COLLECT_SET(case when key = 'school' then value end) as school
from table_info
group by id;
四、列转行
转换要求:行转列需保留列名,如下图:
方式一:采用union all的形式
SELECTdt_month,'valid_num' AS type,SUM(valid_num) AS num
FROMtemp.temp_xw_rowtocol
GROUP BYdt_month
UNION ALLSELECTdt_month,'unvalid_num' AS type,SUM(unvalid_num) AS numFROMtemp.temp_xw_rowtocol;
方式二:使用lateral view和str_to_map
SELECTa.dt_month,add_t.type,add_t.num
FROMtemp.temp_xw_rowtocol a lateral VIEW explode (str_to_map (CONCAT('valid_num=',valid_num,'&unvalid_num=',unvalid_num),'&','=')) add_t AS type,num;
方式三:思路和方式二一致,稍微简单点,缺点只能含explode函数(列名称默认key和value也可自定义)
SELECTexplode (str_to_map (concat('valid_num=',valid_num,'&unvalid_num=',unvalid_num),'&','='))
FROM temp.temp_xw_rowtocol a;
五、解析JSON字段
insert overwrite table dwd_start_log
PARTITION (dt='2019-02-10')
select get_json_object(line,'$.mid') mid_id,get_json_object(line,'$.uid') user_id,get_json_object(line,'$.vc') version_code,get_json_object(line,'$.vn') version_name,get_json_object(line,'$.l') lang,get_json_object(line,'$.sr') source,get_json_object(line,'$.os') os,get_json_object(line,'$.ar') area,get_json_object(line,'$.md') model,get_json_object(line,'$.ba') brand,get_json_object(line,'$.sv') sdk_version,get_json_object(line,'$.g') gmail,get_json_object(line,'$.hw') height_width,get_json_object(line,'$.t') app_time,get_json_object(line,'$.nw') network,get_json_object(line,'$.ln') lng,get_json_object(line,'$.la') lat,get_json_object(line,'$.entry') entry,get_json_object(line,'$.open_ad_type') open_ad_type,get_json_object(line,'$.action') action,get_json_object(line,'$.loading_time') loading_time,get_json_object(line,'$.detail') detail,get_json_object(line,'$.extend1') extend1
from ods_start_log
where dt='2019-02-10';
Hive SQL行列转换相关推荐
- SQL行列转换6种方法
在进行报表开发时,很多时候会遇到行列转换操作,很对开发人员针对于SQL级别行列转换操作一直不甚理解,今天正好抽空对其进行了一些简单的总结.这里主要列举3种可以实现SQL行列转换的方法,包括通用SQL解 ...
- 数据透视表sql:用SQL行列转换实现数据透视的一些思考
用SQL行列转换实现数据透视的一些思考 摘要:根据对报表开发过程中碰到的需要用SQL行列转换进行解决的一类查询统计问题的分析,逐步探索求解得到一种较通用的解决思路,并用函数进行实现.该解决思路及函数实 ...
- SQL实战篇:SQL行列转换及真题
对于数据分析师来说,日常进行SQL分析和制作报表的过程中,经常会遇到通过SQL进行行列转换的需求,本节内容对常见的行列转换进行了总结,常见的行列转换包括以下四种情况: 列转行 行转列 列转换成字符串 ...
- SQL行列转换问题整理
1.普通行列转换 假设有张学生成绩表(tb)如下: Name Subject Result 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 李四 物理 94 ...
- sql行列转换 求学过01和02的人
参考自:(14条消息) SQL:行列转换_lch_2016的博客-CSDN博客_sql行列转换 sql: where 不能使用聚合函数,不能使用同一等级的别名 行转列: 用到的是case 的第一种用法 ...
- hive sql 时间戳转换与时间的各种转换
目录 from_unixtimefrom_unixtime 日期转小时函数hour与年月日分秒 from_unixtimefrom_unixtime hive sql 中时间戳转换函数: 由bigin ...
- 大数据之hive:行列转换系列总结
目录 1.行转列(一) 主要使用: 示例 2.列转行(一) 示例 3.行转列(二) 示例 4.列转行(二) 示例 1.行转列(一) 主要使用: CONCAT(string A/col, string ...
- SQL ON Hadoop-Hive(六)-字符串函数+行列转换
一.hive常用字符串函数 1.字符串反转函数reverse(string A) --返回值类型stringselect reverse('gian') from iteblog; --'naig'2 ...
- Hive行列转换使用
Hive典型应用场景之行列转换 在使用Hive处理数据时,经常遇到行列转换的场景,本文将对Hive的行列转换操作做详细的说明.行转列 1)多行转多列 假设数据表 row2col:col1 col2 c ...
- [转载]SQL Server行列转换实现
一.Pivot和UnPivot介绍 1.Pivot介绍 PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVO ...
最新文章
- zipparameters 使用_JAVA利用Zip4j解压缩【转】
- android realm删除对象,Android Realm-从服务访问Realm对象
- python sin(x)/x 图像
- 【ABAP】通过ST05分析程序执行路径
- fedora14编译安装skyeye-1.3.2
- c++ tinyxml2 解析xml小坑
- [Java] ArrayList、LinkedList、Vector的区别
- DS Storage Manager 忘记管理密码恢复
- DBSCAN 聚类算法详解
- 魔兽服务器信息文件,魔兽世界2.4.3公众测试服务器补丁说明文档
- 遏制流氓软件的方法:禁止360的sesvc.exe在后台运行
- 下拉刷新?我看好MaterialRefreshLayout!
- 猴子也能学会的jQuery第七期——jQuery动画(上)
- 大数据实时传输组件Maxwellmaxwell中遇到的问题
- Android安全机制(二)
- 简单介绍下C/S与B/S架构的异同
- JS 计算年龄为几岁几月几天
- 微软签约云南 将在云南建IT学院和软件中心
- Android屏蔽HOME键亲测可用
- Stata:敏感性分析-rcr