Hive入门-面向产品的Hive教程

0.正经的前言

这是一篇面向产品经理的Hive分享。目的是使受众更好的使用Hive client或其他封装Hive的产品。用HQL查询使用数据及应注意的问题和技巧。

0.1.主要内容:

  • Hive的基本原理
  • Hive的使用教程
  • Hive使用注意事项
  • HQL的使用技巧

0.2.建议读者:

  • 大数据相关产品经理
  • 初级数据分析师

0.3.不涉及:

  • Hive的安装与配置
  • Hive的开发与调优
  • Hive的管理员相关知识

1.Hive的基本原理

要理解Hive绕不开Hadoop。我在知乎上有个关于Hadoop1.0诞生的比喻 回答。看完记得点赞

1.1 Hadoop的尴尬

Hadoop是一个开源框架来存储和处理大型数据在分布式环境中。但是,它“不好用”

  • MapReduce“不好用”,它可以处理大型数据,但是需要用Java写很多的Map、Reduce和调度类,专业性很强,门槛高,一般人写不了。
  • HDFS“不好用”,它提供了分布式的存储,解决了大数据存储的问题,但是很多原有的数据架构都是基于传统型关系型数据库(比如Mysql),迁移到HDFS困难。

简单的说,以前我们把数据放到一个数据库里的某张表里,而不是HDFS这样的目录上;我们使用SQL处理、转换数据而不是MapReduce这样的Java程序。

于是,duang~duang~duang~
Hive 诞生了

1.2 Hive的作用

Hive是什么?

  • Hive是一个基于HDFS的数据仓库工具
  • Hive是可以将HQL转化为MapReduce进行数据处理查询的工具

Hive不是什么?

  • Hive不是一个关系型数据库
  • Hive不能实时查询和行级更新。

1.3 Hive的原理

Hive的执行原理
[图片上传失败…(image-eeb4d6-1545810755094)].jpeg)
你需要知道的Hive的执行原理

Hive将SQL(Hive SQL)转化成MapReduce并执行。

Hive的存储原理

《Hive入门-面向产品的Hive教程》 存储原理

你需要知道的Hive的存储原理

Hive按分区存储,所以查询时最好在where加上分区条件。

知道Hive是做什么的了,我们接下来了解如何使用Hive

2.Hive的使用教程

不论是Hive client或者Hue或者其他的封装工具比如我司的Puck和数据工坊。其实都是学习HQL的使用。
2.1 Select Where
select 表示我想要表的那些列;where 表示我想要表的那些行。这实际是个对于大表过滤出小表的过程。

示例: 有表employee如下(节选),按部门Dept分区。查询研发部薪水高于5000的选手的ID、Name、Des。

IDNameSalaryDesDept
3777乔峰50000研发总监研发部
3778柳梦璃27000商务经理商务部
3779宁缺18000开发工程师研发部
3780魏璎珞5000实习生研发部
hive> SELECT ID,Name,Des FROM employee WHERE salary>5000 and Dept = '研发部';
IDNameDes
3777乔峰研发总监
3779宁缺开发工程师

在查询前,我不太确定结果数据有多少条,我只想看一条例子数据,这时候可以用limit限制,limit通常在select语句的最后

hive> SELECT ID,Name,Des FROM employee WHERE salary>5000 and Dept = '研发部' limit 1;
IDNameDes
3777乔峰研发总监

2.2 Select Order By

Order by 可以使Select Where查询出来的结果表按某一列升序或者降序排列

示例: 上表employee表,查询研发部的选手的ID、Name、Des,按薪水升序排列。

hive> SELECT ID,Name,Des FROM employee WHERE Dept = '研发部' ORDER By Salary;
IDNameDes
3780魏璎珞实习生
3779宁缺开发工程师
3777乔峰研发总监

2.3 Select Group By

包含group by的查询就不再是简单的“过滤”。它会把结果数据多行聚合为一行(多行按某种逻辑合并为一行),通常搭配聚合函数(count、sum)等一起使用。
示例: 上表employee表,统计各部门人数并按人数多少降序排序。

hive> SELECT Dept,count(*) from employee group by Dept ORDER By count(*) desc;
Deptcount(*)
研发部3
商务部1

这个列名不太好看,我们可以利用列别名的方式重命名列名

hive> SELECT Dept as Deptment,count(*) as Number from employee group by Dept ORDER By Number desc;
DeptmentNumber
研发部3
商务部1

2.4 Select Join

对于sql的初学者来讲,第一个比较难的点可能就是join了。简单来说,join就是把两(多)个表连接在一起,通常搭配on来说明按什么条件连接在一起。

举个例子
employee表

IDNameSalaryDesDept
3777乔峰50000研发总监研发部
3778柳梦璃27000前端工程师研发部
3779宁缺18000开发工程师研发部
3780魏璎珞5000实习生研发部

layoffs表

IDEIDfre
1012761N+1
1023779N+2.5
10337800
1044120N+1

柳梦璃也转到我们部门了,我想看看我们部门谁上了优化名单

hive>select * from employee a join layoffs b on a.id = b.eid;

由下表可以看出 join(或者是inner join)会按条件a表的id等于b表的eid这个条件连接,只保留连接上的数据。

IDNameSalaryDesDeptIDEIDfre
3779宁缺18000开发工程师研发部1023779N+2.5
3780魏璎珞5000实习生研发部10337800
hive>select * from employee a left join layoffs b on a.id = b.eid;

由下表可以看出 left join(或者是left outer join)会按条件a表的id等于b表的eid这个条件连接,不论是否连接上都保留左边表的所有数据。

IDNameSalaryDesDeptIDEIDfre
3779宁缺18000开发工程师研发部1023779N+2.5
3780魏璎珞5000实习生研发部10337800
3777乔峰50000研发总监研发部NULLNULLNULL
3778柳梦璃27000前端工程师研发部NULLNULLNULL
hive>select * from employee a right join layoffs b on a.id = b.eid;

由下表可以看出 right join(或者是right outer join)会按条件a表的id等于b表的eid这个条件连接,不论是否连接上都保留右边表的所有数据。(其实这个不常用)

IDNameSalaryDesDeptIDEIDfre
3779宁缺18000开发工程师研发部1023779N+2.5
3780魏璎珞5000实习生研发部10337800
NULLNULLNULLNULLNULL1012761N+1
NULLNULLNULLNULLNULL1044120N+1
hive>select * from employee a full join layoffs b on a.id = b.eid;

由下表可以看出 full join(或者是full outer join)会按条件a表的id等于b表的eid这个条件连接,不论是否连接上都保留左右右边表的所有数据。(其实这个也不常用)

IDNameSalaryDesDeptIDEIDfre
3779宁缺18000开发工程师研发部1023779N+2.5
3780魏璎珞5000实习生研发部10337800
3777乔峰50000研发总监研发部NULLNULLNULL
3778柳梦璃27000前端工程师研发部NULLNULLNULL
NULLNULLNULLNULLNULL1012761N+1
NULLNULLNULLNULLNULL1044120N+1

几种join的关系如图

《Hive入门-面向产品的Hive教程》 image

2.5 其他技巧

2.5.1 正则表达式

很多时候我们为了懒省事节约时间,我们可以用“*”来表达:我全都要

hive> select * from meitu //所有的列我全要
hive> select symbol,`price.*` from meitu //price字段(map)所有的value我全要
hive> select distinct uid from meitu where date like '*' //所有日期我全要,注意搭配like
hive> select * from meitu where street RLIKE '.*(Chicago|Ontario).*'; //RLIKE是hive的拓展功能可以搭配java的正则使用(如果你会写正则表达式的话)

2.5.2 嵌套Select

我们可以把查询结果也看作一个表,用括号括起来,作为一个表嵌套在sql中

select Name from (select a.id,Name,Salary,b.id as lid,b.Fre from employee a join layoffs b on a.id = b.eid) as m 

2.5.3 case when

case when 用来处理单个列的结果,是数据分析人员使用的最频繁的一个功能之一。这个东西玩的6了是相当好用的功能

hive> select Name,salary,case when salary < 10000 then 'low' when salary >= 10000 and salary < 20000 then 'mid' else 'hight' end as bracket from employee
NameSalarybracket
乔峰50000hight
柳梦璃27000hight
宁缺18000mid
魏璎珞5000low

2.5.4 其他常用函数

hive 提供了丰富的函数可以使用,包括数学函数、聚合函数、表生成函数等等,数据工坊上也由很多的udf可以使用,这里暂时不细讲。

3.Hive使用注意事项

3.1注意or的使用注意加括号

hive> select count(*) from meipai where controller_p = 'gifts' and action_p = 'live_consume' and logdate > 2016060100 and logdate < 2018121200 and is_najia!=1 or is_majia is null and coins is not null

注意!这个地方一定要加括号!(is_najia!=1 or is_majia is null),不然的话hive会认为or和前面的条件是两个对立的情况,所以会扫描所有的分区,直接崩掉!

//hive会认为这个逻辑
 where (controller_p) = 'gifts' and action_p = 'live_consume' and logdate > 2016060100 and logdate < 2018121200 and is_najia!=1) or (is_majia is null)
    原文作者:lu_yao
    原文地址: https://www.jianshu.com/p/249f86f0ffb7
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞