一、行转列

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行列转换相关推荐

  1. SQL行列转换6种方法

    在进行报表开发时,很多时候会遇到行列转换操作,很对开发人员针对于SQL级别行列转换操作一直不甚理解,今天正好抽空对其进行了一些简单的总结.这里主要列举3种可以实现SQL行列转换的方法,包括通用SQL解 ...

  2. 数据透视表sql:用SQL行列转换实现数据透视的一些思考

    用SQL行列转换实现数据透视的一些思考 摘要:根据对报表开发过程中碰到的需要用SQL行列转换进行解决的一类查询统计问题的分析,逐步探索求解得到一种较通用的解决思路,并用函数进行实现.该解决思路及函数实 ...

  3. SQL实战篇:SQL行列转换及真题

    对于数据分析师来说,日常进行SQL分析和制作报表的过程中,经常会遇到通过SQL进行行列转换的需求,本节内容对常见的行列转换进行了总结,常见的行列转换包括以下四种情况: 列转行 行转列 列转换成字符串 ...

  4. SQL行列转换问题整理

    1.普通行列转换 假设有张学生成绩表(tb)如下: Name Subject Result 张三 语文 74 张三 数学 83 张三 物理 93 李四 语文 74 李四 数学 84 李四 物理 94 ...

  5. sql行列转换 求学过01和02的人

    参考自:(14条消息) SQL:行列转换_lch_2016的博客-CSDN博客_sql行列转换 sql: where 不能使用聚合函数,不能使用同一等级的别名 行转列: 用到的是case 的第一种用法 ...

  6. hive sql 时间戳转换与时间的各种转换

    目录 from_unixtimefrom_unixtime 日期转小时函数hour与年月日分秒 from_unixtimefrom_unixtime hive sql 中时间戳转换函数: 由bigin ...

  7. 大数据之hive:行列转换系列总结

    目录 1.行转列(一) 主要使用: 示例 2.列转行(一) 示例 3.行转列(二) 示例 4.列转行(二) 示例 1.行转列(一) 主要使用: CONCAT(string A/col, string ...

  8. SQL ON Hadoop-Hive(六)-字符串函数+行列转换

    一.hive常用字符串函数 1.字符串反转函数reverse(string A) --返回值类型stringselect reverse('gian') from iteblog; --'naig'2 ...

  9. Hive行列转换使用

    Hive典型应用场景之行列转换 在使用Hive处理数据时,经常遇到行列转换的场景,本文将对Hive的行列转换操作做详细的说明.行转列 1)多行转多列 假设数据表 row2col:col1 col2 c ...

  10. [转载]SQL Server行列转换实现

    一.Pivot和UnPivot介绍 1.Pivot介绍 PIVOT用于将列值旋转为列名(即行转列),在SQL Server 2000可以用聚合函数配合CASE语句实现 PIVOT的一般语法是:PIVO ...

最新文章

  1. zipparameters 使用_JAVA利用Zip4j解压缩【转】
  2. android realm删除对象,Android Realm-从服务访问Realm对象
  3. python sin(x)/x 图像
  4. 【ABAP】通过ST05分析程序执行路径
  5. fedora14编译安装skyeye-1.3.2
  6. c++ tinyxml2 解析xml小坑
  7. [Java] ArrayList、LinkedList、Vector的区别
  8. DS Storage Manager 忘记管理密码恢复
  9. DBSCAN 聚类算法详解
  10. 魔兽服务器信息文件,魔兽世界2.4.3公众测试服务器补丁说明文档
  11. 遏制流氓软件的方法:禁止360的sesvc.exe在后台运行
  12. 下拉刷新?我看好MaterialRefreshLayout!
  13. 猴子也能学会的jQuery第七期——jQuery动画(上)
  14. 大数据实时传输组件Maxwellmaxwell中遇到的问题
  15. Android安全机制(二)
  16. 简单介绍下C/S与B/S架构的异同
  17. JS 计算年龄为几岁几月几天
  18. 微软签约云南 将在云南建IT学院和软件中心
  19. Android屏蔽HOME键亲测可用
  20. Stata:敏感性分析-rcr

热门文章

  1. vue2+vant2搭建H5框架
  2. 3D游戏引擎入门课程——场景渲染
  3. PHP目录函数 opendir (打开目录句柄)
  4. web页面响应时间统计工具
  5. ARINC 429 过滤介绍
  6. 惠威T200B刷机 Q群
  7. HDU2030-汉字机内码
  8. socket通信压力测试
  9. TextCNN keras 实现
  10. matlab chrom(i pos),Matlab遗传算法问题 MATLAB遗传算法