前言:老刘不敢说写的有多好,但敢保证尽量用大白话把自己复习的内容详细解释出来,拒绝资料上的生搬硬套,做到有自己的了解!01

hive知识点(3)

还是那句话,虽然这些都是hive的常用函数,很多人不在意,但是日常开发中会遇到很多业务需要用到这些函数,我们至少要熟悉一些常用函数,肚子里有点货。

本篇文章第22点:explode、第23点:行转列、第24点:列转行是重点中的重点,需要熟练掌握它们的实例。

第18点:数值计算

1、取整函数round

它返回的是double类型的整数值部分,采用四舍五入的形式。

select round(3.1415926) from tableName;
3select round(3.5) from tableName;
4

2、指定精度取整函数round

它返回的是指定精度的double类型。

select round(3.1415926,4) from tableName;
3.1416

3、向下取整函数: floor

返回等于或者小于该double变量的最大的整数

select floor(3.1415926) from tableName;
3select floor(25) from tableName;
25

4、向上取整函数: ceil 

返回等于或者大于该double变量的最小的整数

select ceil(3.1415926) from tableName;
4select ceil(46) from tableName;
46

知识点都太多了,老刘每次讲几个就行了,剩下的大家如果感兴趣,可以自行去搜搜。

第19点:日期函数

1、日期时间转日期函数: to_date  

返回日期时间字段中的日期部分

select to_date('2011-12-08 10:03:01') from tableName;
2011-12-08

2、日期转年函数: year
返回日期中的年。

select year('2011-12-08 10:03:01') from tableName;
2011select year('2012-12-08') from tableName;
2012

3、日期转月函数:month

返回日期中的月份

select month('2011-12-08 10:03:01') from tableName;
12select month('2011-08-08') from tableName;
8

4、日期比较函数

返回结束日期减去开始日期的天数

select datediff('2012-12-08','2012-05-09') from tableName;
213

5、日期增加函数:date_add

返回开始日期startdate增加days天后的日期

select date_add('2012-12-08',10) from tableName;
2012-12-18

6、日期减少函数:date_sub

返回开始日期startdate减少days天后的日期。

select date_sub('2012-12-08',10) from tableName;
2012-11-28

第20点:条件函数

这部分不讲,感兴趣的,可以自行搜搜。

第21点:字符串函数

1、字符串长度函数:length

返回字符串A的长度

2、字符串反转函数:reverse

返回字符串的反转结果

select reverse('abcedfg') from tableName;
gfdecba

3、字符串截取函数:substr

返回字符串从start位置到结尾的字符串

select substr('abcde',3) from tableName;
cde

4、字符串转大写函数:upper,ucase  

返回字符串A的大写格式

select upper('abSEd') from tableName;
ABSED

5、字符串转小写函数:lower,lcase

返回字符串的小写格式

select lower('abSEd') from tableName;
absed

第22点:hive当中的lateral view与explode

现在直接开始讲hive当中的lateral view与explode,这部分相当重要。

在实际开发过程中,会遇到很多复杂的array或者map结构,根据一些业务要求会把这些复杂的结构从一列拆成多行,这个时候就需要用到explode。

直接举例说明这个explode,跟着老刘一起练习。

需求:现在有数据格式如下
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          |
+-----------+-------------+--+

第一步:我们先创建数据库,并使用刚刚创建的数据库

create database hive_explode;use hive_explode;

第二步:创建完数据库后,就要开始创建hive的表

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形式,这一块老刘虽然没讲,但是这块真的很重要,根据这些复合函数里面的分隔符,我们的分割代码是这样写的:

平常的空格形式是

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了。

第23点:行转列

首先关于行转列和列传行要说的是,它们非常非常重要,会遇到很多需要进行转换的需求。

但是呢,行转列和列转行并不是把1行转为1列和1列转为1行,很多资料对行转列和列转行都有自己的看法,老刘按照尚硅谷的来。咱们先不管这个概念,把它们的用法搞清楚即可。

行转列:就是把多个列里的数据变为1列。

用一个例子演示行转列。

name constellation blood_type
孙悟空 白羊座 A
老王 射手座 A
宋宋 白羊座 B
猪八戒 白羊座 A
冰冰 射手座 A

然后就是把星座和血型一样的人归类到一起,结果如下:

射手座,A            老王|冰冰
白羊座,A            孙悟空|猪八戒
白羊座,B            宋宋

这里面还涉及到concat函数,先讲一讲连接函数:

concat():返回输入字符串连接后的结果,支持任意个输入字符串;concat_ws():这个就是把一个分隔符加到连接的字符串之间;collect_set():将某字段进行去重汇总,产生array类型字段。

接下来,我们要做的就是创建表导入数据。

1、创建文件,注意数据使用\t进行分割

cd /kkb/install/hivedatas
vim constellation.txt
孙悟空    白羊座 A
老王    射手座 A
宋宋    白羊座 B       
猪八戒    白羊座 A
凤姐    射手座 A

2、创建hive表并加载数据

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

3、加载数据

load data local inpath '/kkb/install/hivedatas/constellation.txt' into table person_info;

可以查询一下导入表后的情况,select * from person_info.

4、查询数据

注意注意,根据我们的需求,查询结果是需要进行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;

第24点:列转行

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是列名。

第25点:hive当中的分析函数-分组求topN

对于一些比较复杂的数据求取过程,常常会用到分析函数,分析函数主要用于分组求topN、求取百分比、进行数据切分等。

大家注意下,分组求topN中提到了分组,分组就会涉及到分区。

所以分组求topN的分析函数,一般用rank()结合partition by使用。

第26点:hive自定义函数

hive自带了一些函数,例如max、min等。但是,数量有限啊,遇到复杂需求,这些函数用不了,我们就需要进行自定义函数了。

根据自定义函数类别可以分为三种:

1、UDF 一进一出2、UDAF 聚集函数 多进一出 类似于count、max、min3、UDTF 一进多出 类似于lateral view explode

这个部分就讲这么多了,遇到类似需求的时候,可以在搜搜。

第27点:hive表的数据压缩

老刘直接对这部分进行总结,一般使用snappy的压缩方式,它压缩和解压缩的速率是最好的。

可以在map输出阶段压缩

1)开启hive中间传输数据压缩功能set hive.exec.compress.intermediate=true;2)开启mapreduce中map输出压缩功能set mapreduce.map.output.compress=true;3)设置mapreduce中map输出数据的压缩方式set mapreduce.map.output.compress.codec= org.apache.hadoop.io.compress.SnappyCodec;

也可以在reduce输出阶段压缩

1)开启hive最终输出数据压缩功能set hive.exec.compress.output=true;
2)开启mapreduce最终输出数据压缩set mapreduce.output.fileoutputformat.compress=true;
3)设置mapreduce最终数据输出压缩方式set mapreduce.output.fileoutputformat.compress.codec = org.apache.hadoop.io.compress.SnappyCodec;
4)设置mapreduce最终数据输出压缩为块压缩set mapreduce.output.fileoutputformat.compress.type=BLOCK;

02

hive总结

老刘说了这么多,第22点explode、第23点行转列、第24点列转行是需要熟练掌握的地方,其余的大家有印象就行。

最后,如果觉得有哪里写的不好或者有错误的地方,可以联系老刘,进行交流。希望能够对大数据开发感兴趣的同学有帮助,希望能够得到同学们的指导。

如果觉得写的不错,给老刘点个再看!

hive double 转decimal_大白话详解大数据hive知识点,老刘真的很用心(3)相关推荐

  1. 2导出指定表结构_大白话详解大数据hive知识点,老刘真的很用心(2)

    老刘不敢说写的有多好,但敢保证尽量用大白话把自己复习的内容详细解释出来,拒绝资料上的生搬硬套,做到有自己的了解! 01 hive知识点(2) 第12点:hive分桶表 hive知识点主要偏实践,很多人 ...

  2. 一篇文章详解大数据技术和应用场景

    " 本文作者 陈睿 ,优知学院创始人 新技术.新趋势往往趋之若鹜却又很难说的透彻,希望这篇文章能让大家完整的理解什么是大数据:该篇包含:大数据.技术.场景应用以及大数据的岗位. 什么是大数据 ...

  3. 万字详解大数据平台异地多机房架构实践

    大家好,我是一哥,我在18年的时候刚好经历过一次机房的数据迁移,之前也给大家分享给 → 你经历过完整的大数据平台迁移吗?,今天看到B站的这个方案,推荐给大家~ 01 背景 随着B站业务的高速发展,业务 ...

  4. 万字详解大数据架构新概念

    随着近几年数据湖概念的兴起,业界对于数据仓库和数据湖的对比甚至争论就一直不断.有人说数据湖是下一代大数据平台,各大云厂商也在纷纷的提出自己的数据湖解决方案,一些云数仓产品也增加了和数据湖联动的特性. ...

  5. 详解 | 大数据在智慧城市中的应用

    2019独角兽企业重金招聘Python工程师标准>>> 在智慧城市的建设和应用中,将产生从TB到PB级越来越多的数据,从而进入大数据时代.2011年,Science专刊指出大数据时代 ...

  6. 万字长文详解大数据应用实战案例-万亿级大数据监控平台建设方案

    前言 随着互联网业务的迅速发展,用户对系统的要求也越来越高,而做好监控为系统保驾护航,能有效提高系统的可靠性.可用性及用户体验.监控系统是整个运维环节乃至整个项目及产品生命周期中最重要的一环.百分点大 ...

  7. 详解大数据、数据存储和边缘计算技术在元宇宙中的应用

    导读:如果未来的数字社会属于元宇宙,那么我们需要什么来支撑如此庞大的数字世界? 作者:成生辉 来源:大数据DT(ID:hzdashuju) 元宇宙是指与物理世界分离的平行数字世界,由人创造并以数字形式 ...

  8. 一文详解大数据平台架构

    大数据的4V特征 公司的"大数据" 随着公司业务的增长,大量和流程.规则相关的非结构化数据也爆发式增长.比如: 1.业务系统现在平均每天存储20万张图片,磁盘空间每天消耗100G: ...

  9. 监管层详解大数据查老鼠仓:马乐案曾上演“窃听风云”

    严查老鼠仓风暴之下,资管行业噤若寒蝉,管理层则主动走出来,划明"高压"红线,欲拓宽行业沟通交流渠道. 近日,<每日经济新闻>记者获悉,上海市基金同业公会日前召集基金业投 ...

最新文章

  1. @程序员,“10倍工程师”都在追这四大AI风向
  2. 在学术发展上,不论困难与否,应该给自己一个清晰定位
  3. 第94:受限玻尔兹曼机
  4. 前端学习(1170):findIndex
  5. Oracle数据库重启后密码失效的问题(r12笔记第91天)
  6. Java-keepalived
  7. (76)ila使用?
  8. mysql配置所有ip连接_Mysql查看用户连接数配置及每个IP的请求情况
  9. 科技公司 CEO 合谋“诈骗”自家公司超 900 万美元,现已被捕
  10. 深度学习2.0-13.神经网络与全连接层之张量实战
  11. C# 图书管理系统(MySQL)——代码(四)
  12. 基于springboot旅游系统
  13. 硬件工程师岗位应聘为什么都要求精通CC++呢,这其中有什么说法吗
  14. C++中string类
  15. SQL Server 下载和安装详细教程(点赞收藏)
  16. 微信支付报错提示“商户号该产品权限未开通,请前往商户平台产品中心检查后重试...
  17. 变量 内存 分配 ios iphone
  18. 蚂蚁金服区块链切入新场景,支付宝首创公积金黑名单及缴存证明
  19. Ubuntu Intel显卡驱动安装 (Ubuntu 14.04--Ubuntu 16.10 + Intel® Graphics Update Tool)
  20. 雾锁FCoin:局中局套住了谁?

热门文章

  1. Python爬虫之环境安装
  2. 降低成本是永恒的追求(xamarin)
  3. 【C Sharp笔记】2010年9月25日
  4. php当前完整url的写法
  5. Apache 查看连接数
  6. mysql 表连接 on_MysQL中表连接中“using”和“on”之间的区别是什么?
  7. 回溯算法——复原IP地址(Leetcode 93)
  8. 明晚直播预告丨Oracle 19c X86下移经验分享
  9. 数据 3 分钟 | 阿里云数据库 2020 技术年报发布、TiDB 开启 Hacking Camp、达梦云数据库免费体验...
  10. STM32+华为云IoTDA,带你设计一个属于自己的动态密码锁