Hive个人总结

什么是Hive

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

Hive的优缺点

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

Hive架构原理

在这里插入图片描述
在这里插入图片描述

Hive数据库
存储位置HDFS本地文件系统或块设备
数据更新读多写少,不建议经常改写可以经常对数据进行修改
索引有限的索引功能,不建议使用可以提高效率
执行引擎Map Reduce(默认)/Spark/Tez自己的引擎
数据规模大规模小规模
执行延迟延迟高数据规模小的时候,延迟低
可过展性扩展性高扩展能力弱
视图只有逻辑视图,没有物化视图有物化视图(oracle和mysql),可提高查询速度

Hive数据类型

基本数据类型

Hive数据类型Java数据类型长度例子
TINYINTbyte1byte有符号整数20
SMALINTshort2byte有符号整数20
INTint4byte有符号整数20
BIGINTlong8byte有符号整数20
BOOLEANboolean布尔类型,true或者falseTRUE FALSE
FLOATfloat单精度浮点数3.14159
DOUBLEdouble双精度浮点数3.14159
STRINGstring字符序列。可以指定字符集,可以使用单引号或者双引号‘TriumPhSK’ “TriumPhSK”
TIMESTAMP时间类型,整数,浮点数或者字符串1327882394(Unix新纪元秒)1327882394.123456789(Unix新纪元秒并跟随有纳米秒数)‘2019-06-06 16:18:58.123456789’(JDBC所兼容的Java.sql.Timestamp时间格式)
BINARY字节数组

集合数据类型

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

类型转化

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。

内部表(管理表)和外部表

EXTERNAL关键字可以让用户创建一个外部表
Hive创建内部表时,会将数据移动到数据仓库指向的路径;若创建外部表,仅记录数据所在的路径,不对数据的位置做任何改变。在删除表的时候,内部表的元数据和数据会被一起删除,而外部表只删除元数据,不删除数据
相互转换:
内部表转为外部表:

alter table managedTable set tblproperties('EXTERNAL'='TRUE');

外部表转为内部表

alter table externalTable set tblproperties('EXTERNAL'='FALSE');

分区表(动态分区)

Hive默认是静态分区
使用动态分区的时候必须开启动态分区(动态分区默认是关闭的),语句如下:

set hive.exec.hynamic.partition=true;

用动态方式加载数据到目标表 ,加载之前先设置一下下面的参数:

set hive.exec.dynamic.partition.mode=nonstrict;

这个属性默认是strict,即限制模式,strict是避免全分区字段是动态的,必须至少一个分区字段是指定有值即静态的,且必须放在最前面。设置为nonstrict之后所有的分区都可以是动态的了。

set hive.exec.max.dynamic.partitions.pernode;

允许创建的动态分区的最大数量(100)

set hive.exec.max.dynamic.partitions;

允许创建的所有动态分区的最大数量(1000)

set hive.exec.max.created.files;

允许创建的文件的最大数量(100000)

动态分区插入数据

insert overwrite table par_tab partition(country, state)
select name, country, state from tab;

混合使用动态和静态分区:
静态分区键必须在动态分区键之前

insert overwrite table par_tab partition(country="China", state)
select name, country, state from tab;

country="China"表示静态分区;state表示动态分区
静态分区一 定会创建分区,不管SELECT语句的结果有没有数据。而动态分区,只有在SELECT结果的记录数>0的时候,才会创建分区。

排序

- 全局排序(Order By)
所有数据都通过一个reduce进行处理,所以可能消耗太漫长的时间来执行
-局部排序(Sort By)
对每个reduce排序,每个reduce的输出数据都是有序的,(并非全局有序)
-Distribute By
依据map输入的键计算相应的哈希值,然后按照得到的哈希值将键-值对均分发到多个reduce中去。
如果和Sort by合用,Distribute By 要写在Sort By 前面
- Cluster By
cluster by除了具有distribute by的功能外还兼具sort by的功能。但是排序只能是升序排序,不能指定排序规则为ASC或者DESC。

Hive优化

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TriumPhSK

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值