1,启动Hive服务
(1)启动HiveServer2服务
nohup hive --service metastore &
(2)启动Metastore服务
nohup hive --service hiveserver2 &
(3)查看进程信息
lsof -i:10000
2,分区表概述
定义:在大数据开发中,若要加载与显示一个超大数据规模的文件,为了提升获取数据的效率,通常也可以切割成一个个小文件夹存放。这种过程,可以称为分区
使用场景:地域,省市区,年月日等这些分级的更适合通过分区表划分
2.1单分区表,多分区表
(1)以对存有海量数据的student表为例,仅以月份字段来分区时,表示单分区表。
(2)示例·:再以对存有海量数据的student表为例,当以年份、月份、日期等多个字段来分区时,表示多分区表。(三级分区)
内部表、外部表是同一级别的数据表,而它们都可以有分区表、分桶表。
通俗地说,表分区其实就是HDFS上的不同文件夹,采用此方式可以极大的提高特定场景下Hive的操作性能
2.2创建分区表
create [external] table 表名(
字段名 字段类型 [comment '注释'],
字段名 字段类型 [comment '注释'],
...
)
[partition by(分区列 数据类型, ...)]
[row format delimited
fields terminated by '指定分隔符'];
1,说明:
(1)partition表示给数据表分区处理,但后面字段有多个时,表示多分区表;
(2)分区列名不允许与表字段同名,要单独命名,一般以年、月、日分区;
(3)注意:partition的位置要放在设定分隔字符语句之前。
-- 创建分区表: 年
create table tb_score(
name string,
subject string,
number double
)
partitioned by (year string)
row format delimited
fields terminated by "\t";
插入数据
insert into tb_score partition (year="2014") values ("张三","男",59.9);
3,使用分区表
3.1查看分区表
(1)在HDFS页面中查看
进入HDFS页面后,我们可以看到一个个的分区是以文件夹的形式显示。
(2)desc查看表字段信息
可以使用desc命令查看表相关信息,语法
-- 查看基本信息
desc 表名;
-- 以序列化形式查看更多信息
desc extended 表名;
-- 以表格形式查看所有信息
desc formatted 表名;
(3)显示有哪些分区表
当给表设定了多个分区后,可以查看到有哪些分区,命令:
show partitions 表名;
use sz41db_part;
show tables ;
desc tb_score;
desc extended tb_score;
desc formatted tb_score;
show partitions tb_score;
show partitions tb_score; -- 如何解决?
实际上,给表建立分区,就是以分区列来创建对应名称的子文件夹。
3.2加载数据
当要给分区表添加数据时,通常做法有:
-- 从本地Linux系统中导入数据到表中
load data local inpath 'linux本地文件路径名' into table 表名;
-- 从HDFS中导入数据到表中
load data inpath 'hdfs文件路径名' [overwrite] into table 表名;
3.3修改表
对于分区列的值,可以使用alter关键字进行修改,修改操作有:
(1)添加分区
当要给数据表新增一个分区时,可以使用add关键字,语法:
alter table 表名 add partition(分区字段='分区值');
(2)删除分区
删除一个失效分区时,需要用到drop关键字,语法:
alter table 表名 drop partition(分区字段='分区值');
(3)修改分区值
可以使用rename to关键字来修改分区列所对应的值,语法:
alter table 表名 partition(分区字段='旧分区值') rename to partition(分区字段='新分区值');
示例代码:
use sz41db_part;
show tables ;
show partitions tb_score;
alter table tb_score add partition (year="4444");
alter table tb_score add partition (year="5000");
alter table tb_score drop partition (year="4444");
alter table tb_score drop partition
(year="__HIVE_DEFAULT_PARTITION__");
alter table tb_score partition (year="5000") rename to
partition (year="6666");
若要修改分区表信息时,一般需要借助alter关键字。
3.3.1修复分区表
当我们手动在HDFS页面中创建分区目录,甚至给分区目录下导入结构化数据后,发现使用:仍然无法查询出数据结果,这是为什么呢?
没有在HDFS中刷新出分区数据信息,导致无法识别。
而实际上,这个操作称为修复分区表
msck repair table 表名;
4,多分区表案例
当对数据表进行多级分区处理时,常以年、月、日形式来划分数据。
create table part_product(
pid int,
pname string,
price double,
number int
)
partitioned by (year string, month string, day string)
row format delimited
fields terminated by ";";
插入数据:
-- 上传数据到linux中, 加载到表中
load data local inpath
"/root/day08_hive/more_part/order20230415.txt" into table part_product partition (year="2023",month="4",day="15");
建议给表设定分区列的类型设定为字符串,方便后期操作;
5.分桶表的使用
定义:分桶表也叫做桶表,源自建表语法中【bucket】单词,是一种用于优化查询而设计的表类型。
该功能可以让数据分解为若干个部分,且易于管理的文件。
通俗地说,对表进行分桶处理,和分区类似,也是一种通过改变表的存储模式,从而完成对表优化的一种调优方式。
但和分区不同,分区是将表拆分到不同的子文件夹中进行存储,而分桶是将表拆分到固定数量的不同文件中进行存储。
原理:在分桶时,我们要指定根据哪个字段来将数据分为几桶(即几个部分),而桶编号相同的数据会被分到同一个桶当中。
分桶默认规则是:
Bucket number = hash_function(bucketing_column) mod num_buckets
# hash_function() 函数名
# bucketing_column 值类型
:hash_function函数的返回值,取决于分桶字段bucketing_column的类型。
(1)如果是int类型,hash_function(int) == int;
(2)如果是其他类型,比如string或复杂数据类型,hash_function比较棘手,将是从该类型生成的某个数字,比如hashcode值。
# 可以通过select hash("值") 查看哈希码
5.1 创建与使用分桶表
create [external] table 表名(
字段名 字段类型 [comment '注释'],
字段名 字段类型 [comment '注释'],
...
)
[partition by(分区列 数据类型, ...)]
[clustered by (字段名) into 分桶数 buckets]
[row format delimited
fields terminated by '指定分隔符'];
说明:
(1)clustered表示给数据表分桶处理,且后面的[into 分桶数 buckets]的数字,表示桶数为多少;[下面说明]
(2)需要注意的是,分桶的字段必须是表中已经存在的字段名;
(3)若分区、分桶同时存在,且分区语句在前,分桶在后;
(4)注意:clustered的位置要放在partition字符语句之后。
示例代码:
create table bucket_id_course(
id int,
subject string,
name string
)
clustered by (id) into 3 buckets
row format delimited
fields terminated by "\t";
desc formatted bucket_id_course;
load data local inpath "/root/day08_hive/bucket/course01.txt"
into table bucket_id_course;
特别注意,分桶列必须是表内已有的字段名,可以是数值型、也可以是字符串型。
5.3hash建模
创建分桶表语法:
create [external] table 表名(
字段名 字段类型 [comment '注释'],
字段名 字段类型 [comment '注释'],
...
)
[clustered by (字段名) into 分桶数 buckets]
...
上述格式中[分桶数]代表分桶的数量。而如果没有额外修改reduce数量时,默认分桶数和reduce值一致。
分桶的原理:首先,对分桶字段值进行Hash算法加密,然后对分桶数量进行取模,生成对应分桶文件。
了解:Hash算法是一种数据加密算法,其原理我们不去详细讨论,我们只需要知道其主要特征:
同样的值被Hash算法加密后的结果,是一致的!
比如,"heima"哈希值是99159456, 无论hash对3取模多少次,结果都是0。
# 可以通过select hash("值") 查看哈希码
基于如上特征,在辅以有3个分桶文件的基础上,将Hash的结果基于3取模(即除以
3取余数)。结果:
一个字符串或无论什么数据,得到的取模结果均是:0、1、2,其中一个。
5.4分桶表的优势
1,和非分桶表相比,使用分桶表能带来性能提升。优势有:
(1)提升过滤性能
基于分桶字段的where过滤查询时,可减少全表扫描:
select * from course where id=xxx;
(2)提升join多表查询
JOIN时可以提高MapReduce程序效率,减少笛卡尔积数量。
对于JOIN操作两个表有一个相同的列,如果对这两个表都进行了分桶操作。那么将保存相同列值的桶进行JOIN操作就可以,这样能大大较少JOIN的数据量
(3)提升分组效率
以某列作为分组时,可减少全表扫描,进入到分桶表中处理,效率高一些
(4)提升抽样处理
当对分桶表数据进行抽样可减少数据的抽样处理
当数据量特别大时,对全体数据进行处理存在困难,抽样就显得尤其重要了。
抽样可以从被抽取的数据中,估计和推断出整体的特性,是科学实验、质量检验、社会调查普遍采用的一种经济有效的工作和研究方法。
使用分桶表对海量数据内容作文件拆分后,一般能对过滤带来不少性能提升;