Hive的内表和外表以及分区表

1、 内表和外表的区别

内表和外表之间是通过关键字EXTERNAL来区分。删除表时:

内表:在删除时,既删除内表的元数据,也删除内表的数据

外表:删除时,仅仅删除外表的元数据。

CREATE [EXTERNAL] TABLE page_view(viewTime INT, userid BIGINT,

     page_url STRING, referrer_url STRING,

     ip STRING COMMENT 'IP Address of the User',

     country STRING COMMENT 'country of origination')

   COMMENT 'This is the staging page view table'

   ROW FORMAT DELIMITED FIELDS TERMINATED BY ' '      

  (注意:这里还需要注意一个问题,就是在创建表的时候,最好是预先指定行字段的间隔符,否则导入数据的时候,若字段的间隔符不一致的话可能就导入不进去。)

   STORED AS TEXTFILE

   LOCATION '<hdfs_location>';

2、 分区表

分区表是通过关键字PARTITIONED BY来实现分区,一个表有一个或多个分区,分区是以字段的形式在表结构中存在,通过describe table命令可以查看到字段存在, 但是该字段不存放实际的数据内容,仅仅是分区的表示(伪列) 。 

在HDFS中,分区每个分区的值都会产生相应的文件夹,然后在对应的文件夹下存放相应的表数据。

分区表的应用场景分析:假如针对全球的一家电子商务公司,现在有这样一个业务需求就是需要了解一下海外市场的情况,目的是进一步想拓展海外市场,但是公司对海外市场的拓展现在还没有任何的了解,那么怎么帮助公司管理层提供数据上的支撑呢?这个时候可以对之前公司针对全球销售的商品通过按“国家”来分区,在查询的时候,以国家为为纬度来进行分析海外的市场情况。

例如:

create table table_name (

  id  int,

  dtDontQuery string,

  name string

)

partitioned by (date string)

 (1)修改分区

  1)修改分区的存储路径

    ALTER TABLE table_name PARTITION (dt='2008-08-08') SET LOCATION "new location";

     注意格式:dt='2008-08-08' :dt表示分区名,'2008-08-08'表示对应分区值。注意格式。若是字符串的话就是“string”

     "new location"就是对应存储路径,应该是绝对路径

  2)修改分区名称

    ALTER TABLE table_name PARTITION (dt='2008-08-08') RENAME TO PARTITION (dt='20080808');

(2)删除分区

  ALTER TABLE login DROP IF EXISTS PARTITION (dt='2008-08-08');

  ALTER TABLE page_view DROP IF EXISTS PARTITION (dt='2008-08-08', country='us');

(3)添加分区

ALTER TABLE table_name ADD PARTITION (partCol = 'value1') location 'loc1'; //示例

 

ALTER TABLE table_name ADD IF NOT EXISTS PARTITION (dt='20130101') LOCATION '/user/hadoop/warehouse/table_name/dt=20130101'; //一次添加一个分区

ALTER TABLE page_view ADD PARTITION (dt='2008-08-08', country='us') location '/path/to/us/part080808' PARTITION (dt='2008-08-09', country='us') location '/path/to/us/part080809';  //一次添加多个分区