个人大数据总结之hive(二)--------表类型简介
前面两篇文章我已经对hive的基本定义、安装以及简单实用做了一个详细的介绍,今天我就对hive中表的类型在做一个简单介绍,希望各位看官满意~
一、hive中表的分类
hive中的表可以分为外部表和内部表。
(1)内部表(MANAGED_TABLE,又被称为管理表、受控表)
它指的是表中数据受到了表定义的影响,在删除表的定义时,表中的数据也会随之被删除。
创建内部表(就是普通的建表语句):
hive> create table fz > (id int,name string,age int,tel string) > ROW FORMAT DELIMITED > FIELDS TERMINATED BY ',';
(2)外部表(EXTERNAL_TABLE)
它指的是表中数据不受表定义的影响,当删除表结构时,表中的数据并不会被删除。它其实相当于java中的引用。
外部表相对于内部表来说,有两大好处:
①可以提高数据安全,在删除表时,并不会对数据造成影响。
②操作共享数据。
创建外部表(使用关键字external ):
create external table t8_external_1 (id int) location '/input/hive';
在创建表的时候,要指定数据所在的目录,注意:此处是目录,而不是文件
或者直接使用:alter table t8_external set location '/input/hive/data';使用引用的方式进行加载
在hive中内部表和外部表是可以相互转换的:
内部表转为外部表:alter table test set tblproperties("EXTERNAL", "TRUE");
外部表转内部表:alter table test set tblproperties("EXTERNAL", "FALSE");
二、hive中的两种功能表
(1)分区表
①hive中的表为什么要分区?因为hive中的数据通常会非常庞大,如果要按照某些条件进行查询的话,那就会去扫描整个hive表,这样的话,查询消耗的时间就会非常长。这时候对hive中表进行分区就会非常有必要了。
那么何谓分区呢?
分区是指按照数据表的某列或某些列分为多个区,分区从形式上可以理解为文件夹。需要注意的是:分区依据的不是真实数据表文件中的列,而是我们指定的伪列(即分区使用的列在我们表结构中并不存在)。
②创建一个分区表:
create table t1(
id int,
name string comment "this is t1's column name"
) partitioned by (name string) comment "TABLE t1";
以下这张图便是根据日期进行的一个分区,在hive表中创建的分区,其实就是相当于hdfs上的一个文件夹。
其次,向分区表导入数据的时候,要通过关键字partition(dt=“20171111”)显示声明数据要导入到表的哪个分区,这里表示要将数据导入到分区为dt=“20171111”的分区。
load data local inpath '/opt/data/hive/hive-t1-1.txt' into table t1 partition(dt=“20171111”);
③分区表的基本操作
查询分区:show partitions t1;
添加分区:alter table t1 add partition(dt='20191111');
删除分区:alter table t1 drop partition (dt='20191111');
(2)分桶表
在我们对hive表中数据进行分区后,由于分区的特点,可能会造成分区数据分布不均匀,进而影响到整体的查询效率,这时候,我们需要对数据重新进行一个划分,做到相对均匀。此时,分桶便是我们的一种解决方案。
分桶是相对于分区来说更细粒度的划分。分桶将整个数据内容按照某列列属性的hash值进行区分,如果按照id属性分为五个桶,就是对id的hash值对5取模,按照取模结果对数据分桶。取模结果相同的数据会被放在一个桶内。
桶表有两大好处:
①在多表关联的时候,可以提高我们的查询效率,但是前提是需要对关联字段做一个分桶。
②抽样
创建一个桶表:
create table buckettest(id int) clustered by (id) into 3 buckets;
向桶表中加载数据:
只能通过其他的表进行转换,不能直接使用load加载
insert into buckettest select id from t1;
三、数据的加载和导出
(1)加载([]==>可选,<> ==>必须)
①从文件中加载
load data [local] inpath 'path' [overwrite] into table [tableName];
local:
有==>从linux本地加载数据
无==>从hdfs加载数据
overwrite
有==>覆盖掉表中原来的数据
无==>在原来的基础上追加新的数据
②从其他表中加载
insert <overwrite|into> table [tableName1] select [...] from [tableName2] [...];
overwrite
有==>覆盖掉表中原来的数据
无==>在原来的基础上追加新的数据
==>会转化成为MR执行
需要注意的地方:[tableName1]中列要和select [...] from [tableName2]这里面的[...]一一对应起来。
③创建表的时候加载
create table [tableName1] as select [...] from [tableName2] [...];
这样会创建一张表,表结构为select [...] from t_src中的[...]
④动态分区的加载
快速复制表结构: create table t1 like t2;
要将2016的数据都到入到t_d_partition的相关的分区中
insert into table t_d_partition partition(class, year=2016) select id, name, class from t_partition_1 where year=2016;
(2)导出
①在hdfs上直接操作
hadoop fs -cp /data/hive/test /data/export/test
或者
hive> export table test to '/data/export/test';
②在终端使用directory
insert overwrite local directory '/opt/data/' select * from test where 1=1;
写到这里,我对hive的总结基本就结束了,但是后期可能会在出一篇对hive中函数使用的总结,耐心等待吧~~