个人大数据总结之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上的一个文件夹。

个人大数据总结之hive(二)--------表类型简介 

其次,向分区表导入数据的时候,要通过关键字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;

个人大数据总结之hive(二)--------表类型简介
 

要将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中函数使用的总结,耐心等待吧~~