Hive 总结

Hive 总结


总结人:XXX 2020.04.29

0.补充

0.1 什么是hive

1. Hive:由Facebook开源用于解决'海量结构化日志'的数据统计'工具'2. Hive是基于Hadoop的一个'数据仓库工具',可以将结构化的数据文件'映射'为一张表,并提供类SQL查询功能。
3. '本质':将HQL转化成MapReduce程序
4. '原理介绍'1)Hive处理的数据存储在HDFS
    (2)Hive分析数据底层的实现是MapReduce
    (3)执行程序运行在Yarn上

0.2 优缺点

-- 1. 优点:
   1. 操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。
   2. 避免了去写MapReduce,减少开发人员的学习成本。
   3. Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合。
   4. Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。
   5. Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。
-- 2. 缺点
   1. Hive的HQL表达能力有限
   2. 迭代式算法无法表达
   3. 数据挖掘方面不擅长,由于MapReduce数据处理流程的限制,效率更高的算法却无法实现。
   4. Hive的效率比较低
    (1)Hive自动生成的MapReduce作业,通常情况下不够智能化
    (2)Hive调优比较困难,粒度较粗 

0.3 Hive架构原理

image-20200720000427660
-- 1. 用户接口:Client
	CLI(command-line interface)、JDBC/ODBC(jdbc访问hive)、WEBUI(浏览器访问hive)
-- 2. 元数据:Metastore
	元数据包括:
	   a、表名
	   b、表所属的数据库(默认是default)
	   c、表的拥有者
	   d、列/分区字段
	   e、表的类型(是否是外部表)、
	   f、表的数据所在目录等;
	'默认存储在自带的derby数据库中,推荐使用MySQL存储Metastore'
-- 3. Hadoop
	使用HDFS进行存储,使用MapReduce进行计算。
-- 4. 驱动器:Driver
	1. '解析器'SQL Parser):将SQL字符串转换成抽象语法树AST,这一步一般都用第三方工具库完成,
	   比如antlr;对AST进行语法分析,比如表是否存在、字段是否存在、SQL语义是否有误。
    2. '编译器'(Physical Plan):将AST编译生成逻辑执行计划。
    3. '优化器'(Query Optimizer):对逻辑执行计划进行优化。
    4. '执行器'(Execution):把逻辑执行计划转换成可以运行的物理计划。对于Hive来说,就是MR/Spark。

0.4 hive与数据库的比较

由于 Hive 采用了类似SQL 的查询语言 HQL(Hive Query Language),因此很容易将 Hive 理解为数据库。其实从结构上来看,Hive 和数据库除了拥有类似的查询语言,再无类似之处

-- 1. 查询语言
    hive有类似sql的hql查询语言
-- 2. 数据更新
	1. hive针对数据仓库而设计,适合读多写少的场景
	2. mysql的数据需要经常进行修改。
-- 3.  执行延迟
	1. hive没有索引 + 基于mr计算,延迟性高;
	2. 这个低是有条件的,即数据规模较小,当数据规模大到超过数据库的处理能力的时候,Hive的并行计算显然能体现出优势
-- 4. 数据规模
    1. 支持大数据规模的数据

0.5 tez引擎

1. 'mr引擎':每个任务及任务之间都需要落盘
2. 'Tez引擎':可以将多个有依赖的作业转换为一个作业,这样只需写一次HDFS,且中间节点较少,从而大大提升作业的计算性能。

image-20200720001521940

一、HiveJDBC客户端基本操作

1.1 HvieJDBC的登入与退出

-- 方式一:使用beeline方式
访问方式:beeline -u jdbc:hive2://hadoop102:10000 -n lianzp
退出方式:!quit  、!exit 、 ctrl + c
前提:mysql服务和hiveservice2服务一定要启动

-- 方式二: 使用hive的方式
访问方式:hive
退出方式:quit; exit;

1.2 Hive常用的交互命令

  • “-e” 不进入hive的交互窗口执行sql语句**

  • “-f” 执行脚本中sql语句**

1.3 Hive数据类型

  • 基本数据类型
Hive数据类型 Java数据类型 长度 例子
TINYINT byte 1byte有符号整数 20
SMALINT short 2byte有符号整数 20
INT int 4byte有符号整数 20
BIGINT long 8byte有符号整数 20
BOOLEAN boolean 布尔类型,true或者false TRUE FALSE
FLOAT float 单精度浮点数 3.14159
DOUBLE double 双精度浮点数 3.14159
STRING string 字符系列。可以指定字符集。可以使用单引号或者双引号。 ‘now is the time’ “for all good men”
TIMESTAMP 时间类型
BINARY 字节数组
  • 重点关注:int,string,double,bigint ;

  • 使用注意事项:在sql中需要指定字段的长度,而在hive中不需要,可以理解为可变参数 ;

  • 数据类型的字节数:

byte short int long float double char
1 2 4 8 4 8 2

​ 其中float的取值范围比long还要大。

  • 集合数据类型

    数据类型 描述 语法示例
    STRUCT 和c语言中的struct类似,都可以通过“点”符号访问元素内容。例如,如果某个列的数据类型是STRUCT{first STRING, last STRING},那么第1个元素可以通过字段.first来引用。 struct()例如struct<street:string, city:string>
    MAP MAP是一组键-值对元组集合,使用数组表示法可以访问数据。例如,如果某个列的数据类型是MAP,其中键值对是’first’->’John’和’last’->’Doe’,那么可以通过字段名[‘last’]获取最后一个元素 map()例如map<string, int>
    ARRAY 数组是一组具有相同类型和名称的变量的集合。这些变量称为数组的元素,每个数组元素都有一个编号,编号从零开始。例如,数组值为[‘John’, ‘Doe’],那么第2个元素可以通过数组名[1]进行引用。 Array()例如array

创建表的实例:

create table if not exists test(
name string,
friends array<string>,  /*--数组的格式--*/
children map<string, int>, /*--集合的格式--*/
address struct<street:string, city:string>/* --Struct格式-- */
)
row format delimited fields terminated by ',' 
/*  行 格式      划分属性    以‘,’分割  ,统称为列分割符*/
collection items terminated by '_'
/*集合(数组,集合,Struct) 多个元素之间以‘_’ 分割,则要求所有的数据的格式均是一样的*/
map keys terminated by ':'
/*指明集合中key和value以‘:’ 进行分割*/
lines terminated by '\n';
/*行数据,以换行符进行分割*/

获取集合中属性的方式:

* 	数组:使用索引的方式:字段名[index]
*
*	集合:使用key的值获取:字段名[key的值]
*
*	Struct:使用:字段.属性值

1.4 类型转化

  1. 隐式类型转换规则

    • 任何整数类型都可以隐式地转换为一个范围更广的类型,如TINYINT可以转换成INT,INT可以转换成BIGINT;

    • 所有整数类型、FLOAT和STRING类型都可以隐式地转换成DOUBLE;

    • TINYINT、SMALLINT、INT都可以转换为FLOAT;

    • BOOLEAN类型不可以转换为任何其它的类型。

  2. CAST操作显示进行数据类型转换

    -- 示例:
    select cast ('1' as int) + 3  ;  /* 4 */
    select '1' + 3 ; /* 4.0 */
    

二、DDL数据定义

2.1 数据库操作

2.1.1显示和查询数据库与表信息
1.显示数据库
show databases;
2.切换数据库
use 数据库名;
3.查询数据库详细信息
desc database [extended] 数据库名
4.查询表的详细信息
desc [formatted] 表名

2.1.2 创建数据库
CREATE DATABASE [IF NOT EXISTS] database_name
[COMMENT database_comment]
[LOCATION hdfs_path] 
[WITH DBPROPERTIES (property_name=property_value, ...)];

实例:

1.create database db_hive;

2.create database if not exists db_hive; 
/* 加上 if not exists 后,当该数据库已存在时,不抛异常,也不做创建数据库的操作*/

3.create database db_hive2 location '/db_hive2.db';
/*指定数据创建时,在hdfs上的路径,如果没有此操作,则默认的路径为:/user/hive/warehouse/数据库名*/
2.1.3 删除数据库
1.删除空的数据库(何为空的数据库?指该数据中没有表)
drop database db_hive2 ;
2.当数据库不存在时,避免抛异常
drop database if not exists db_hive2 ;
3.当数据库不为空时,加上cascade进行删除
drop database if not exists db_hive2  cascade ;

2.2 表的操作

2.2.1 建表语法
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] table_name 
[(col_name data_type [COMMENT col_comment], ...)] 
[COMMENT table_comment] 
[PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)] 
[CLUSTERED BY (col_name, col_name, ...) 
[SORTED BY (col_name [ASC|DESC], ...)] INTO num_buckets BUCKETS] 
[ROW FORMAT row_format] 
[STORED AS file_format] 
[LOCATION hdfs_path]
[TBLPROPERTIES (property_name=property_value, ...)]
[AS select_statement]

各个参数说明:

  1. EXTERNAL :表示外部表,在删除表时,只会删除mysql中的元数据,在hdfs的真实数据不会被删除,如果没EXTERNAL ,则删除表的时候,元数据和真实数据均为被删除。

  2. IF NOT EXISTS :当表存在时,添加此操作,则不会抛异常,同时也不会执行建表操作。

  3. COMMENT :字段或表的注释;

  4. PARTITIONED BY : 分区**(后面详细讲)**;

  5. CLUSTERED BY : 分桶**(后面详细讲)**;

  6. SORTED BY :文件在hdfs的存储格式 ,存储的方式有:SEQUENCEFILE(二进制序列文件)、TEXTFILE(文本)、RCFILE(列式存储格式文件)

    如果文件数据是纯文本,可以使用STORED AS TEXTFILE。如果数据需要压缩,使用 STORED AS SEQUENCEFILE;

  7. ROW FORMAT row_format :列分割符;

  8. LOCATION hdfs_path:指定表在HDFS上的存储位置;默认为当前库下。

  9. AS select_statement :建表时进行加载数据,通过as后面的查询语句。

2.2.2 管理表与外部表

区别:

1.管理表:也称内部表,当删除管理表时,hdfs中的数据和mysql中的元数据均会被删除 -- 控制表的生命周期
2.外部表:当删除管理表时,hdfs中的数据不会被删除,mysql中的元数据会被删除  -- 不能控制表的生命周期

在实战过程中,我们一般都是使用外部表。

内外部表的定义、查看和转换

1.定义:
创建表单时,加上 external 关键字则表示为外部表。

2.查看:
通过 desc formatted 表名 。

3.转换:
alter table 表名 set tblproperties('EXTERNAL'='TRUE');
注意事项:
a、TRUE :   转换为外部表;
b、FALSE : 转换为内部表;
c、('EXTERNAL'='TRUE')和('EXTERNAL'='FALSE
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值