带你了解主流计算引擎Hive-上篇

1. Hive是什么?

Hive 是基于 Hadoop 的一个数据仓库工具,可以将结构化的数据文件映射为一张数据库,并提供类 SQL 查询功能;

本质: 将SQL转换为MapReduce进行运算,底层是由HDFS存储。

我们也可以理解为:Hive是MapReduce的客户端。

2. 为什么要用Hive?

学习MapReduce的成本高,而且MapReduce实现复杂的查询功能的开发难度比较大。如果我们使用Hive的话,不用学习怎么写MapReduce程序,减少了学习成本,而且Hive采用的类SQL的语法可以快速开发,易学好上手。

3. Hive有什么特点?(好处)

除了前面说的Hive的好处-易上手之外,Hive还有其他的好处(特点):

  • 可扩展 : Hive 可以自由的扩展集群的规模,一般情况下不需要重启服务。
  • 延展性 : Hive 支持用户自定义函数,用户可以根据自己的需求来实现自己的函 数。
  • 容错性 : 良好的容错性,节点出现问题 SQL 仍可完成执行。

4. Hive的架构?

在这里插入图片描述

Hive的基本组成:

  • 用户接口
    • CLI — 是shell命令行;
    • JDBC/ODBC — Hive的Java实现;
    • WebGUI — 通过浏览器访问Hive;
  • 元数据存储
    • Hive将元数据通常存储在关系型数据库MySQL中;
    • Hive的元数据包括 表的名字,表的列,表的分区,以及表的属性(是否为外部表),表的数据所在目录等等;
  • Drive 驱动 – 解析器 --> 编译器 --> 优化器 --> 执行器
    • 作用 : 将HQL进行解析,编译,优化,生成执行计划,然后调用底层的MapReduce计算框架;

5. HQL转化大致流程

  • 1、客户端连接到HiveSever2,目前大多数通过beeline形式连接。
  • 2、提交SQL,通过Drive进行解析、编译、优化逻辑计划,生成物理计划;
  • 3、对物理计划进行优化,并提交到执行引擎进行计算;
  • 4、返回结果;

细节流程:

  1. 客户端和HiveServer2建立连接,创建会话;
  2. 提交SQL,转交到Driver进行处理;
  3. Driver内部会通过解析器对SQL语句进行解析,检验语法是否正确;
  4. 然后通过编译器对语句进行编译,生成AST tree(抽象语法树);
  5. 语义分析器会遍历抽象语法树,进一步进行语义分析,这个时候会和Hive MetaStore(元数据库)进行通信,来获取相应的信息,抽象成查询块,逻辑计划生成器会遍历查询块,把它们翻译成逻辑操作符,形成操作树;这个时候是没有优化的逻辑计划;
  6. 优化器会对之前的逻辑计划进行处理,比如进行谓词下推、常量值替换、列裁剪等操作,等到优化后的逻辑计划;
  7. 语义分析器会对已经优化过的逻辑计划进行处理,通过执行器生成物理执行计划TaskTree;
  8. 执行器会很据物理执行计划进行优化,然后根据底层不同的执行引擎进行提交;

6. Hive和Hadoop的关联

Hive利用HDFS进行存储数据,利用MapReduce查询分析数据;
在这里插入图片描述

7. Hive和传统数据库的区别、比较

Hive和传统数据库除了查询语言类似之外,再无其它共同点;

  • 处理数据的规模:Hive是用于海量数据的离线分析,数据量大,而传统数据库数据量小
  • 数据存储: Hive是存储到HDFS中,而传统数据库存在本地磁盘;
  • 执行引擎:Hive执行引擎是MapReduce,而传统数据库有自己的引擎;
  • 执行延迟:Hive延迟大,因为它要走MapReduce,数据库延迟小,但是当数据量特别大时,Hive的并行处理就能体现优势;

8. Hive操作

1.1 DDL - 数据定义语言

  • 创建数据库: create database【if not exits】 数据库名;
  • 查看数据库: show database
  • 删除空数据库: drop database 【if not exits】数据库名;
  • 数据不为空怎么删除此数据库(强制删除): drop database 数据库名 cascade;
  • 使用进入数据库:use 数据库名;
  • 分区表: partitioned by
    • 分区的好处和意义:
      • 避免Hive全表扫描,提升查询效率;
      • 减少数据冗余,提升指定分区的查询效率;
      • 查询时尽量使用分区字段,不适用的话,就会全表扫描;
    • 分区表的类型
      • 静态分区:手动设置
      • 动态分区:通过数据进行判断;
    • 怎么建立分区

---创建分区表 partitioned by(分区字段名 分区字段类型)

creat table fenqubiao_test(
name string comment '名字', 
class int comment ‘班级’ )
partitioned by(class string)
          
--创建分区表之后,此时没有数据,也没有分区,需要建立分区
--建立分区
ALTER TABLE fenqubiao_test add partition(class='105')

-- 查看表 现有的分区
show partitions fenqubiao_test;

-- 静态分区添加数据
insert into table fenqubiao_test partition(class='105')values('xiaoran','120');
insert into table fenqubiao_test partition(class-'105') select name,class from info;

-- 本地文件加载
load data local inpath'/local/wenjian/m.txt' into table fenqubiao_test partition(calss='105');  
                               
  • 分桶表:cluster by
  • 在这里插入图片描述
-- 分区表的创建 creat table 表名(字段1 类型1,字段2,类型2) clustered by(表内字段);

-- 创建分桶表
create table buckets_test(
sku_id sring comment'商品id',
sku_name string comment'商品名称')
clustered by(sku_id) into 3 buckets;

-- 设置自动分桶开关
set hive.enforce.bucketing=true;
-- 为分桶表添加数据
insert into buckets_test select sku_id ,sku_name from sales_info;

补充:
创建表的数据类型有哪些?

  1. 数字类型:tinyint,smallint,int,bigint,float,double,decimal;
  2. 日期时间类:timestamp,date,inteval
  3. 字符串类:string,varchar,char;
  4. 布尔类型:Boolean
    5.复合类型: array(数组),map(键值对),struct(结构体);
    .
    创建表需要指定分隔符,常见的特殊分隔符^A ^B ^C
    **^A **:默认情况下,字段与字段;
    ** ^B : 每个元素的分隔符
    ** ^C
    :map的分隔符
    字段分隔符 files terminal by ‘/t’
    array类型分隔符 collection items terminal by ‘/t’在这里插入图片描述

1.2 D

9. Hive内部表和外部表

在这里插入图片描述
由于内部表把原始存储数据以及元数据都删掉了,而外部表仅仅删除了元数据,所以外部表比较安全,相比于内部表,所以实际应用中外部表用的比较多,而内部表可以用于建临时表;

10. Hive DML - 数据操作语言

1.1 数据装载

(1) 从本地装载数据

  • 普通表:oad data local inpath’数据文件的路径’ 【overwrite】into 表名
    • overwrite 关键字表示覆盖原有数据
    • 如果没有这个关键词代表添加数据;
  • 分区表:load data local inpath’本地文件路径’ 【overwrite】into table 表名 partition(分区字段 = 值);
  • 分桶表:load data local inpath’本地文件路径’【overwrite】into table 表名

(2)从HDFS中加载数据

     1.linux本地文件上传到HDFS文件系统
       hdfs dfs -put  本地文件路径  hdfs路径
       hdfs dfs -put '/home/hadoop/datas/products_info.txt'  '/datas'
            
     2. 文件数据装载到Hive表中
       load data inpath'hdfs数据文件路径' into table 表名;
       load data inpath'datas/products_info.txt' into table product_info;

1.2 数据的插入

1)普通表

  • insert into 表名 values(值);
    2)分区表
  • insert into 表名 partition(分区字段=字段值) values(值);
    3)分桶表
  • insert into 分桶表名 select * from 中间表;

1.3 数据的导出

  • 导出到本地文件系统
    • insert overwrite local directory ’ 本地文件夹路径 ’ row format delimited fields terminated by ‘ 字段分隔符 ’ 查询语句;
  • 导出到HDFS
  • insert overwrite local directory ’ 文件夹路径 ’ 查询语句;

1.4 数据删除

删除HIve表

  • 删除所有的数据

    • 使用 truncate 仅可以删除内部表的数据,不可以删除表结构;
    • truncate table 表名;
    • 使用 shell 命令行删除外部表数据(hdfs dfs -rm -r 外部表路径)
    • hdfs dfs -rm -r /datas/test_Exteran1/*
  • 删除部分数据

    • 有分区的表 有partition表
        1. 删除具体的partition
          • alter table 表名 drop partition(分区字段=‘值’);
        1. 删除partition内的部分信息(insert overwrite table)
          • 重新把对应的partition信息写一遍,通过where来限定需要留下的信息,没有被留下的信息被删除了;
    • 没有分区的表 无partition表
    • insert overwrite table 表名 select * from 表名 where 条件;
  • 删除整个表

    • 使用drop可以删除整个表
    • drop table 表名;

Guess you like

Origin blog.csdn.net/m0_57102326/article/details/121451124