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业务的三个
 