一. 从Hive开始

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

相关推荐
时差95310 小时前
【面试题】Hive 查询:如何查找用户连续三天登录的记录
大数据·数据库·hive·sql·面试·database
苍老流年10 小时前
Hive中各种Join的实现
数据仓库·hive·hadoop
静听山水10 小时前
Hive:UDTF 函数
hive
EDG Zmjjkk11 小时前
Hive 查询(详细实操版)
数据仓库·hive·hadoop
lzhlizihang13 小时前
【Hive sql 面试题】求出各类型专利top 10申请人,以及对应的专利申请数(难)
大数据·hive·sql·面试题
Hsu_kk13 小时前
Hive 查询各类型专利 Top 10 申请人及对应的专利申请数
数据仓库·hive·hadoop
静听山水13 小时前
Hive 的数据存储单元结构
hive
大数据编程之光13 小时前
Hive 查询各类型专利 top10 申请人及专利申请数
大数据·数据仓库·hive·hadoop
杰克逊的日记13 小时前
Hive详解
数据仓库·hive·hadoop
上辈子杀猪这辈子学IT13 小时前
【Zookeeper集群搭建】安装zookeeper、zookeeper集群配置、zookeeper启动与关闭、zookeeper的shell命令操作
linux·hadoop·zookeeper·centos·debian