Hive的内部表、外部表、分区表、分桶表

内部表和外部表的区别

创建表时,如果没有使用external关键字,则该表是内部表(managed table)
被external关键字修饰的是外部表(external table)

区别

  • 内部表数据由Hive自身管理,外部表则是由HDFS管理。
  • 删除内部表会直接删除元数据(metadata)以及储存数据;删除外部表仅仅会删除元数据,HDFS上的文件并不会被删除。
  • 对内部表的修改会直接同步给元数据,而对外部表的表结构和分区进行修改,则需要修复。

Hive分区表

在Hive Select查询中一般会扫描整个表的内容,会消耗很多时间做没必要的工作。又时只是想关心表中部分数据,因此引入了partition概念。分区表指的是在创建表的时指定的partition的分区空间

将数据组织成分区,主要可以提高数据的查询速度。至于用户存储的每一条记录到底放在哪个分区,有用户决定。即用户在加载数据的时候必须显示的指定该部分数据放到哪个分区。

实现细节

  • 1.一个表可以有一个或者多个分区,每个分区的文件夹的形式单独存在表文件夹下的目录下。
  • 2.表和列名不区分大小写。
  • 3.分区是以字段的形式在表结构中存在,通过describetable命令可以查看到字段的存在。但是该字段不存放实际的数据内容,仅仅是分区的表示(伪列)。

分区表综合练习

(1)需求描述:

现有一个score.csv文件,先存放于集群的 /scoredatas/month=201806 目录下,这个文件每天都会生成,存放到对应的日期文件夹下面去,文件别人也需要公用,不能移动。需求,创建hive对应的表,并将数据加载到表中,进行数据统计分析,而且删除表之后,数据不能删除。

(2)数据准备:

hdfs dfs -mkdir -p /scoredatas/month=20180101
hdfs dfs -put score.csv /scoredatas/month=20180101

在这里插入图片描述

(3)创建外部分区表,并且指定文件的存放位置

create external table score4(s_id string, c_id string,s_score int) partitioned by (month string) row format delimited fields terminated by '\t' location '/scoredatas';

注意:
location关键字是指定表文件的存储目录,我们并没有将该表建立在month=20180101目录下,是因为month=20180101目录是一个分区目录,我们需要将创建的表放在表文件的存储目录下。

(4)进行表的修复(建立表与数据文件之间的一个映射关系)

msck repair table score4

在这里插入图片描述


Hive桶

对于每一个表或者分区,Hive可以进一步组织成桶,也就是说更细的数据范围划分。Hive也是针对某一列进行桶的组织。Hive采用对列值哈希,然后初一桶的个数求余的方式决定该条记录存放在哪个桶中。

把表(或者分区)组织成桶(Bucket)有俩个理由:
(1)获得更高的查询处理效率。桶为表加了额外的结构,Hive在处理有些查询时能利用这个结构。具体而言,连接俩个在()

扫描二维码关注公众号,回复: 13304703 查看本文章

分桶表操作

分桶,就是将数据按照指定的字段进行划分到多个文件当中去,分桶就是MapReduce中的分区.

(1)开启Hive的分桶功能

set hive.enforce.bucketing=true;

hive.enforce.bucketing 参数默认是false,表示分桶功能默认关闭。

(2)设置Reduce个数

set mapreduce.job.reduces=3;

(3)创建分桶表

create table course (c_id string,c_name string,t_id string) clustered by(c_id) into 3 buckets row format delimited fields terminated by '\t';

注意:

  • clustered by 是分桶的一个关键字,,上述命令中clustered by(c_id) 就是指定表字段中的c_id字段作为分桶字段 。
  • 由于桶表的数据加载通过hdfs dfs -put文件或者通过load data均不好使,只能通过insert overwrite创建普通表,并且通过insert overwrite的方式将普通表的数据通过查询的方式加载到通标当中去。

(4)通给桶表中加载数据

1.创建普通表

create table course_common (c_id string,c_name string,t_id string) row format delimited fields terminated by '\t';

2.普通表中加载数据

load data local inpath '/usr/hivedatas/course.csv' into table course_common;

3.通过insert overwirte给同表中加载数据

insert overwrite table course select * from course_common cluster by(c_id)

猜你喜欢

转载自blog.csdn.net/shuyv/article/details/111042860
今日推荐