Hive知识整理

什么是Hive

Hive就是数据统计工具(拿来一组数据算算平均数,算算方差)

如何实现数据统计功能呢?

可以将结构化的数据文件映射为一张表,并提供SQL查询功能。

结构化数据:有规律的数据,结构化数据中光有数据不能成一个表格,因为缺少了最关键描述数据的元数据(描述数据的数据)

Hive的运行思路和理解

Hive不存数据,这些数据全部存在hdfs上面,而Hive能把这些数据映射成一张表,其实Hive给这份数据添加了元数据(描述信息),于是结构化数据就能成一张表了

如果没有Hive这份表处理走mapreduce,hive比mapreduce方便,hive把这份hdfs数据映射成表格,让sql语句来分析,hive在接收我们传的sql语句以后把这句sql语句转化成mapreduce程序来执行,我们可以用写sql的方式来写mapreduce程序,好处就是特别方便

本质是:将HiveSQL转化成MapReduce程序,Hive他不存数据(数据全在hdfs上),他也不计算(计算靠mapreduce),它具有是一个工具(翻译器)将sql翻译成mapreduce。

Hive:由Facebook开源用于解决海量结构化日志的数据统计工具。

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

本质是:将HQL转化成MapReduce程序

 

优点

1.就是简单容易上手

2.处理大数据的

操作接口采用类SQL语法,提供快速开发的能力(简单、容易上手)。

避免了去写MapReduce,减少开发人员的学习成本。

Hive的执行延迟比较高,因此Hive常用于数据分析,对实时性要求不高的场合。

Hive优势在于处理大数据,对于处理小数据没有优势,因为Hive的执行延迟比较高。

Hive支持用户自定义函数,用户可以根据自己的需求来实现自己的函数。

缺点

1.Hive的HQL表达能力有限

(1)迭代式算法无法表达

(2)数据挖掘方面不擅长,由于MapReduce数据处理流程的限制,效率更高的算法却无法实现。

2.Hive的效率比较低

(1)Hive自动生成的MapReduce作业,通常情况下不够智能化

(2)Hive调优比较困难,粒度较粗

 

Hive框架原理

 

数据存储在hdfs上 hive加的元数据存在Meta store上,hive通过元数据把数据变成表格了,hive支持jdbc链接因为他用的是mysql。

当一句sql通过jdbc协议传到hive中的driver里,在driver里执行SQL Parser,s翻译成很多的sql碎片, 然后把这些碎片通过physical Plan编译成mapreduce程序,再把这个程序放入Query Optimizer进行优化,然后在通过Execution执行一下,提交到MapReduce。 然后mapreduce告诉hive执行完了,hive再告诉sql执行完了。

 

但是现在我们用的是Hive3,所以我们会用到Tez做引擎(把mapreduce进行包装,相当于更快更有效率的mapreduce

 

Tez引擎配置

    Tez就是mapreduce的加强版,mapreduce的特点就是如果是多个mapreduce任务链接,他们中间一定要落在磁盘上,每次mapreduce传完写,写完传会产生大量数据传输和磁盘持有化,而Tez会把这些整合成一个动作,直接跳过传输,会把mapreduce做优化,优点就是更快,缺点就是会用到更多的内存

    用Hive直接编写MR程序,假设有四个有依赖关系的MR作业,上图中,绿色是Reduce Task,云状表示写屏蔽,需要将中间结果持久化写到HDFS。Tez可以将多个有依赖的作业转换为一个作业,这样只需写一次HDFS,且中间节点较少,从而大大提升作业的计算性能。

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

字节数组

 

对于Hive的String类型相当于数据库的varchar类型,该类型是一个可变的字符串,不过它不能声明其中最多能存储多少个字符,理论上它可以存储2GB的字符数。

集合数据类型

数据类型

描述

语法示例

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<string>

Hive有三种复杂数据类型ARRAY、MAP 和 STRUCT。ARRAY和MAP与Java中的Array和Map类似,而STRUCT与C语言中的Struct类似,它封装了一个命名字段集合,复杂数据类型允许任意层次的嵌套。

什么是结构体?

类型转化

Hive隐式转化规则(自动转化):

 

STRING和FLOAT能隐式转化成DOUBLE 如果转化不了直接返回null

“2”为STRING类型会向上转化成DOUBLE,而图里的1为int类型直接转换成double类型,这样两个double类型相加变成3.0(在自动转换中可以直接转换到最上层)

(强制转化)可以使用CAST操作显示进行数据类型转换

3.0这个结果是自动转化形成的(把string和int都自动转化成double类型)

3这个结果是用cast(‘1’ as int)把string类型强制转化成int类型

心得:Hive的原子数据类型是可以进行隐式转换的,类似于Java的类型转换,例如某表达式使用INT类型,TINYINT会自动转换为INT类型,但是Hive不会进行反向转化,例如,某表达式使用TINYINT类型,INT不会自动转换为TINYINT类型,它会返回错误,除非使用CAST操作。

1.隐式类型转换规则如下

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

(2)所有整数类型、FLOAT和STRING类型都可以隐式地转换成DOUBLE。

(3)TINYINT、SMALLINT、INT都可以转换为FLOAT。

(4)BOOLEAN类型不可以转换为任何其它的类型。

2.可以使用CAST操作显示进行数据类型转换

例如CAST('1' AS INT)将把字符串'1' 转换成整数1;如果强制类型转换失败,如执行CAST('X' AS INT),表达式返回空值 NULL。

0: jdbc:hive2://hadoop102:10000> select '1'+2, cast('1'as int) + 2;

+------+------+--+

| _c0  | _c1  |

+------+------+--+

| 3.0  | 3    |

+------+------+--+

DDL数据定义

DDL(Data Definition Language)数据定义语言:

适用范围:

生成库生产表,对数据库中的某些对象(例如:database, table)进行管理,如Create,Alter和Drop。

 

创建数据库及增删改查

COMMENT:注释

LOCATION:指定数据库位置,如果不指定默认出现在/user/hive/warehouse下面对应的文件夹

第四行:指定数据库的一些属性(kv值形式)

 

CREATE DATABASE [IF NOT EXISTS] database_name

[COMMENT database_comment]

[LOCATION hdfs_path]

[WITH DBPROPERTIES (property_name=property_value, ...)];

指定的目录就是test数据库,这个文件夹和这个库是映射关系

 

查看数据库信息 加extended是详情查看

desc database extended test;

 

查看所有库

show databases

 

切换库

use 库名

 

看库名

show tables

 

删库(如果库不是空的是删不掉的)

drop database test

 

加关键字能把库删掉(里面有数据也能删)

drop database test cascade

 

修改数据库只能就该数据库的键值对

alter database test set dbproperties(“111”=”222”, “444”= “555”)

AS和like建表区别

使用like创建表

这种方式实质就是复制表结构。在工作中,如果你有一个已经存在的表,现在想创建一个一模一样的表,这个时候这个方法就很省时省力了。复制时,只会复制表结构,不会复制表中属性值(包扣表的分区以及存储格式之类的)

使用as创建表


这种方式是把一张表的某些字段抽取出来,创建成一张新表。

 

这种方式需要注意以下几点:

 

1.as只会复制属性以及属性值到新的表中

 

2.使用as创建的表,并不会带原表的分区(分区丢失),并且分区的字段变成一个正常的字段,没有分区的效用,还有一些字段的约束等(可以通过describe formatted查看)

 

 

创建表

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]

 

 

 

ROW FORMAT:指定这一行数据怎么映射成为一行表格的,映射的方式

列出所有表

show tables

 

看表的具体信息

desc test

 

看表的详细信息

desc formatted test;

 

修改表

重命名

ALTER TABLE table_name RENAME TO new_table_name

 

增加/修改/替换列信息

改列信息

alter table test2 change id id strnig

增加列信息

alter table test2 add columns (class string)

重写所有类信息

alter table test2 replace columns (id double, name string);

猜你喜欢

转载自blog.csdn.net/weixin_43307308/article/details/107002943
今日推荐