1. 怎么理解Hive
Hive不能理解成一个传统意义上的数据库,应该理解成一个解决方案。
是Hadoop在hdfs和mapreduce之后才出现的一个结构化数据处理的解决方案。
Hdfs解决了大数据的存储问题,mapreduce解决了数据的计算问题。
一切似乎很美好。
但是使用成本太高
SQL语言的发明使得,数据处理的门槛减低了很多。
Hive就是为了用户使用sql来处理数据
总结,大数据背景下,hdfs看起来想一个无限大的存储空间,mapreduce的思想充分利用所有的cpu和内存。Hive使得用户可以像单机时代一样,用sql来处理数据。
概念回顾: SQL(Structured Query Language),也就是结构化的查询语言。
所以hive中的一个核心模块就是metastore, 用来存储结构化的信息,也就是“数据的数据”,其实也是借用了传统文件系统的“metaData”(元数据)的概念。
一般会存有多少列,每一列是什么样的数据结构这样的数据。
然后hive的执行引擎会将sql进行语法分析,生成语法树,然后生成mapreduce程序,进行数据的计算工作。
2. Hive背景知识
了解hive之前要了解HDFS,mapReduce的概念
HDFS:分布式文件系统
说白了也是一层中间件,不用自己筛选服务器磁盘,且有备份容错机制
MapReduce:分布式计算引擎(鼻祖)
分治:每一个计算器只计算小部分的
规约:将小部分的计算结果再次联合
这就是mapReduce的灵魂
Hive是在前两者之后出现的,而在这之前处理大数据都是用的mapReduce自己进行编程。
但是这样的做法效率太低,人们还是更加习惯使用sql来处理数据
最初的hive就仅仅是提供了一个sql转成mapReduce的解释器
传统的数据库:数据的存储和数据引擎是一体的。
Hive:存储和引擎分离
Hive特点如下:
- 1.将存储到HDFS的数据给套上一层表结构。
- 2.然后请分布式计算引擎来帮忙写入和查询(mapReduce,Tez,Spark)。
- 3.Hive自己仅仅是维护了一个metastore服务和hiveServer服务,前者提供数据的表结构关系,后者对外提供查询和写入的接口。
- 4.Hive存储数据的数据结构是可选的:txt、orc等,除txt外都是列式存储,而传统的数据库都是行式存储。
- 5.没有索引或者粗粒度的索引
实时计算And离线计算:
实时计算是指对输入数据进行近乎即时的处理和分析,以获取当前状态或预测未来趋势。这种计算方式要求系统能够在数据产生后立即进行处理,并将结果迅速反馈给相关系统或用户。实时计算通常用于需要高时效性和高准确性的场景
离线计算则是指对数据进行非实时、批量式的处理和分析。这种计算方式通常用于对历史数据进行深度挖掘和分析,以发现数据中的模式和趋势,为业务决策提供支持。离线计算不需要即时性,但要求计算结果的准确性和全面性。
3. HQL之DQL
Select
From
Where :可以使用hive支持的任何函数和运算符,但聚合函数除外
Group by:select字段要么是group by分组的字段,要么是被聚合函数应用的字段,聚合函数的本质就是多进一出。
Having:where是没有办法和聚合函数一起使用的,having子句可以让我们筛选分组后 的数据,having中可以使用聚合函数
Order by:全局排序,强烈建议limit和order by一起使用,避免行数过大,如果设置 了hive.mapred.mode为strict时,使用不带limit的order by会有异常。
Limit:用于限制select返回的行数,只给一个参数,代表最大行数,给两个参数代表与 第一行的偏移量。
-
用union注意:
如果要将order by、sort by、cluster by、distribute by、limit用于单个select中,需要括号,例如:
如果要应用于整个union查询,要放在最后一个之后
-
CTE表达式
With 假名 as (select子查询)
Select *
From 假名
其实就是引导定义,支持链式
With q1 as (select子查询)
Q2 as (select子查询)
Select *
From (使用q1和q2) -
内连接
Inner join 或者 join 或者 直接不写
两个表的交集 -
左外连接
Outer可以省略
左表全右表可能不全,而且右边可以为null -
全外连接
Outer可以省略
两边都可以为null,就是并集,两边都全并且去重
就相当于左右外连接同时使用 -
左半开连接
Left semi join
但是结果只会返回左边的字段,并且得到交集,也就是不允许右边为null
效果上等于内连接后,只取左边的字段 -
算术运算符
除并取整 div
除并取余 %
位与运算 & : 全真才真
位或 | : 全假才假
位异或 ^ : 不等为1
位取反 ~ -
逻辑运算符
And
Or
Not 或者 !
In
Not in
Exists : 注意是决定主查询是否得以保留
3.1 Hive函数分两大类
内置函数
用户自定义函数
-
内置函数
数值类型函数
日期类型函数
字符串类型函数
Concat(str1, str2)
Concat(分隔符,str|数组)
Substr(str,start)不是从0是从1开始,负数就是倒着数开始,直到最后
Substr(str,2,2)从2开始并长度为2
正则表达式替换函数
Regexp_replace(str1,正则表达式,str2)
Parse_url()
Split()
集合函数
条件函数
If (1=2, 100, 200) : true为100, false为200
When case 1=1 then XXX
Else
End as 假名
数据脱敏函数 -
用户自定义函数:根据输入输出的行数
UDF: 普通函数,一进一出
UDAF : 聚合函数,多进一出
Count
Avg
Min
Max
多维分析
Grouping_sets
Cube
Rollup
UDTF: 表生成函数,一进多出
Explode()
Array或者map
限制: 只查询源数据表没有问题,只查询explode爆炸的表也没有问题,但是不能都返回
所以hive专门提供了侧视图的语法,专门用来搭配explode这样的UDTF函数
其实就是源join爆炸 -
侧视图
Lateral view XXX()as 假名
是一种特殊的语法,主要搭配UDTF类型函数一起使用,用于解决UDTF函数的限制(也即是爆炸的虚表没有和原表进行连接) -
开窗函数
窗口函数
OLAP函数
特点: 输入值是从select语句的结果集中的一行或者多行的“窗口”中获取的。
关键字:over
最常见的,分组聚合总是会屏蔽很多细节
所以窗口函数的存在使得分组聚合过程中的细节被保留
其中sum比较特殊,有四种不同的用法
还有适合用来top业务的三个