前言:老刘不敢说写的有多好,但敢保证尽可能用大白话把本身复习的内容详细解释出来,拒绝资料上的生搬硬套,作到有本身的了解!数据库
从这篇文章开始决定进行一些改变,老刘在博客上主要分享大数据每一个模块的重点知识点,对这些重点内容进行详细解释,每一个模块的完整知识点分享在公众号:努力的老刘。等有机会了,用视频的方式先对每次分享的知识点进行一次分析和总结,再发文章进行详细的解释。vim
如今开始正文,仍是那句话,虽然这些都是hive的经常使用函数,不少人不在乎,可是平常开发中会遇到不少业务须要用到这些函数,咱们至少要熟悉一些经常使用函数,肚子里有点货。数组
本篇文章中的explode、行转列、列转行是重点中的重点,须要熟练掌握它们的实例。因为hive偏于实操,老刘也只对这些重点知识点进行详细的讲解。函数
为何会用到explode?大数据
在实际开发过程当中,会遇到不少复杂的array或者map结构,咱们会根据一些业务要求把这些复杂的结构从一列拆成多行,这个时候就须要用到explode。可能你仍然不是很懂,如今就直接举例说明这个explode,必定要跟着老刘一块儿练习。光看不练,等于白学!spa
需求:如今有数据格式以下 zhangsan child1,child2,child3,child4 k1:v1,k2:v2 lisi child5,child6,child7,child8 k3:v3,k4:v4 字段之间使用\t分割,需求将全部的child进行拆开成为一列 +----------+--+
| mychild |
+----------+--+
| child1 |
| child2 |
| child3 |
| child4 |
| child5 |
| child6 |
| child7 |
| child8 |
+----------+--+ 将map的key和value也进行拆开,成为以下结果 +-----------+-------------+--+
| mymapkey | mymapvalue |
+-----------+-------------+--+
| k1 | v1 |
| k2 | v2 |
| k3 | v3 |
| k4 | v4 |
+-----------+-------------+--+
第一步:咱们先建立数据库,并使用刚刚建立的数据库3d
create database hive_explode;
use hive_explode;
第二步:建立完数据库后,就要开始建立hive的表code
createtable hive_explode.t3(name string,children array<string>,address Map<string,string>) row format delimited fields terminated by '\t' collection items terminated by ',' map keys terminated by ':' stored as textFile;
注意注意,你们必定要看仔细咯,因为咱们的需求,要建立name,这是字符串形式,可是child这块它是array形式,address是map形式,这一块老刘虽然没讲,可是这块真的很重要,根据这些复合函数里面的分隔符,咱们的分割代码是这样写的:orm
日常的空格形式是视频
row format delimited fields terminated by '\t'
array里面的分割形式是
collection items terminated by ','
map里面的分割形式是
map keys terminated by ':'
这里面的区别,你们要好好记住!
第三步:加载数据
cd /kkb/install/hivedatas/ vim maparray 数据内容格式以下 zhangsan child1,child2,child3,child4 k1:v1,k2:v2 lisi child5,child6,child7,child8 k3:v3,k4:v4
而后利用hive加载数据
load data local inpath '/kkb/install/hivedatas/maparray' into table hive_explode.t3;
咱们导入数据后,能够看看表里面的状况。
第四步:以前是把数据导入了表中,接下来就是对数据进行炸裂
将全部的child进行拆分红为一列
SELECT explode(children) AS myChild FROM hive_explode.t3;
接着将map的key和value也进行拆分
SELECT explode(address) AS (myMapKey, myMapValue) FROM hive_explode.t3;
因为lateral view 经常在行转列和列转行中使用,就不单独讲lateral view了。
首先关于行转列和列转行要说的是,它们很是很是重要,会遇到不少须要进行列转换的需求。
可是呢,行转列和列转行并非把1行转为1列和1列转为1行,不少资料对行转列和列转行都有本身的见解,经常是相反的。
老刘按照尚硅谷的来。我们先无论这个概念,把它们的用法搞清楚便可。
行转列:就是把多个列里的数据变为1列。
用一个例子演示行转列。
而后就是把星座和血型同样的人归类到一块儿,结果以下:
射手座,A 老王|冰冰 白羊座,A 孙悟空|猪八戒 白羊座,B 宋宋
这里面还涉及到concat函数,先讲一讲链接函数:
concat():返回输入字符串链接后的结果,支持任意个输入字符串;
concat_ws():这个就是把一个分隔符加到链接的字符串之间;
collect_set():将某字段进行去重汇总,产生array类型字段。
接下来,咱们要作的就是建立表导入数据。
一、建立文件,注意数据使用\t进行分割
cd /kkb/install/hivedatas vim constellation.txt 孙悟空 白羊座 A 老王 射手座 A 宋宋 白羊座 B 猪八戒 白羊座 A 凤姐 射手座 A
二、建立hive表并加载数据
create table person_info(name string,constellation string,blood_type string) row format delimited fields terminated by "\t";
三、加载数据
load data local inpath '/kkb/install/hivedatas/constellation.txt' into table person_info;
能够查询一下导入表后的状况,select * from person_info.
四、查询数据
注意注意,根据咱们的需求,查询结果是须要进行concat_ws操做的。
select t1.base, concat_ws('|', collect_set(t1.name)) name from (select name, concat(constellation, "," , blood_type) base from person_info) t1 group by t1.base;
老刘解释一下,因为星座和血型用逗号链接,因此咱们应该这样写代码
concat(constellation, "," , blood_type)
接着就是先根据星座和血型同样这个条件,查询出全部的人。
select name, concat(constellation, "," , blood_type) base from person_info
把这个临时表取名为t1,而后把查询出来的人根据需求,多行转一行。因为名字之间用 | 进行.链接的,因此咱们应该这样写代码。
concat_ws('|', collect_set(t1.name))
最后的查询结果是这样的
select t1.base, concat_ws('|', collect_set(t1.name)) name from t1 group by t1.base;
在列转行中,会涉及到两个很是重要的函数:explode和lateral view。
explode:将hive一列中复杂的array或者map结构拆分红多行。
lateral view:通常多用于将一行数据拆成多行数据,在此基础上能够对拆分后的数据进行聚合。
举例说明:
数据内容以下,字段之间都是使用\t进行分割
cd /kkb/install/hivedatas vim movie.txt 《疑犯追踪》 悬疑,动做,科幻,剧情 《Lie to me》 悬疑,警匪,动做,心理,剧情 《战狼2》 战争,动做,灾难
将电影分类中的数组数据展开,结果以下:
《疑犯追踪》 悬疑
《疑犯追踪》 动做
《疑犯追踪》 科幻
《疑犯追踪》 剧情
《Lie to me》 悬疑
《Lie to me》 警匪
《Lie to me》 动做
《Lie to me》 心理
《Lie to me》 剧情
《战狼2》 战争
《战狼2》 动做
《战狼2》 灾难
这就是典型的一行转为多行,使用lateral view和explode结合。
咱们第一步要作的就是根据表的特征以及表里面数据的特征建立表,类别要建立为array类型。
create table movie_info(movie string, category array<string>) row format delimited fields terminated by "\t" collection items terminated by ",";
接着就是加载数据
load data local inpath "/kkb/install/hivedatas/movie.txt" into table movie_info;
最后根据需求查询表,因为类别里面是array类型,如今须要把类别利用lateral view炸开,而后就能够进行查询数据。
select movie, category_name from movie_info lateral view explode(category) table_tmp as category_name;
其中,table_tmp是表名,category_name是列名。
老刘主要就讲述了行转列和列转行,以及两个函数explode和lateral view,而且分别用了两个案列对他们进行了演示,你们必定要跟着案列练习一遍,光看不练,等于白学。
最后,完整的hive知识点(3)内容在公众号:努力的老刘里面。若是以为有哪里写的很差或者有错误的地方,能够联系老刘,进行交流。但愿可以对大数据开发感兴趣的同窗有帮助,但愿可以获得同窗们的指导。
若是以为写的不错,给老刘点个赞!
这就是典型的一行转为多行,使用lateral view和explode结合。
咱们第一步要作的就是根据表的特征以及表里面数据的特征建立表,类别要建立为array类型。