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 '\t'      

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

   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';  //一次添加多个分区