
# 创建Impala表
#### 功能简介
本小节介绍了如何使用Impala SQL建内部表、外部表的基本操作。创建表主要有以下三种方式。
- 自定义表结构，以关键字EXTERNAL区分创建内部表和外部表。
  - 内部表，如果对数据的处理都由Impala完成，则应该使用内部表。在删除内部表时，元数据和数据一起被删除。
  
  - 外部表，如果数据要被多种工具共同处理，则应该使用外部表，可避免对该数据的误操作。删除外部表时，只删除掉元数据。
   
- 根据已有表创建新表，使用CREATE LIKE句式，完全复制原有的表结构，包括表的存储格式。
- 根据查询结果创建新表，使用CREATE AS SELECT句式。 这种方式比较灵活，可以在复制原表表结构的同时指定要复制哪些字段，不包括表的存储格式。
  
 
#### 样例代码
```
-- 创建外部表employees_info. 
CREATE EXTERNAL TABLE IF NOT EXISTS employees_info 
( 
id INT, 
name STRING, 
usd_flag STRING, 
salary DOUBLE, 
deductions MAP<STRING, DOUBLE>, 
address STRING, 
entrytime STRING 
) 
-- 指定行中各字段分隔符. 
-- "delimited fields terminated by"指定列与列之间的分隔符为','. 
ROW FORMAT delimited fields terminated by ','
-- 指定表的存储格式为TEXTFILE. 
STORED AS TEXTFILE;  
 
-- 使用CREATE Like创建表. 
CREATE TABLE employees_like LIKE employees_info; 
 
-- 使用DESCRIBE查看employees_info、employees_like表结构. 
DESCRIBE employees_info; 
DESCRIBE employees_like; 
-- 创建内部表employees_info. 
CREATE TABLE IF NOT EXISTS employees_info 
( 
id INT, 
name STRING, 
usd_flag STRING, 
salary DOUBLE, 
deductions MAP<STRING, DOUBLE>, 
address STRING, 
entrytime STRING 
) 
-- 指定行中各字段分隔符. 
-- "delimited fields terminated by"指定列与列之间的分隔符为','. 
ROW FORMAT delimited fields terminated by ','
-- 指定表的存储格式为TEXTFILE. 
STORED AS TEXTFILE;
```
#### 扩展应用
- 创建分区表 一个表可以拥有一个或者多个分区，每个分区以文件夹的形式单独存在表文件夹的目录下。对分区内数据进行查询，可缩小查询范围，加快数据的检索速度和可对数据按照一定的条件进行管理。
  分区是在创建表的时候用PARTITIONED BY子句定义的。
  ```
  CREATE EXTERNAL TABLE IF NOT EXISTS employees_info_extended 
   ( 
   id INT, 
   name STRING, 
   usd_flag STRING, 
   salary DOUBLE, 
   deductions MAP<STRING, DOUBLE>, 
   address STRING 
   ) 
   -- 使用关键字PARTITIONED BY指定分区列名及数据类型 . 
   PARTITIONED BY (entrytime STRING)  
   STORED AS TEXTFILE;
  ```
  
- 更新表的结构 一个表在创建完成后，还可以使用ALTER TABLE执行增、删字段，修改表属性，添加分区等操作。
  ```
  -- 为表employees_info_extended增加tel_phone、email字段. 
   ALTER TABLE employees_info_extended ADD COLUMNS (tel_phone STRING, email STRING);
  ```
  
- Impala使用OBS存储。 需要在集群管理页面MRS Manager里面设置指定的参数到core-site.xml，AK/SK可登录"OBS控制台"，进入"我的凭证"页面获取。
  ```
  fs.obs.access.key=AK;
  fs.obs.secret.key=SK;
  fs.obs.endpoint=endpoint;
  ```
  新建表的存储类型为obs。
  ```
  create table obs(c1 string, c2 string) stored as parquet location 'obs://obs-lmm/hive/orctest' tblproperties('orc.compress'='SNAPPY');
  ```
  ![](https://support.huaweicloud.com/devg-mrs/public_sys-resources/note_3.0-zh-cn.png)
  当前Impala使用OBS存储时，同一张表中，不支持分区和表存储位置处于不同的桶中。
  例如：创建分区表指定存储位置为OBS桶1下的文件夹，此时修改表分区存储位置的操作将不会生效，在实际插入数据时以表存储位置为准。
  1. 创建分区表并指定表存储路径。
     ```
     create table table_name(id int,name string,company string) partitioned by(dt date) row format delimited fields terminated by ',' stored as textfile location "obs://OBS桶1/桶下文件夹";
     ```
     
  
  2. 修改此表分区位置到另外一个桶下，此时该修改不会生效。
     ```
     alter table table_name partition(dt date) set location "obs://OBS桶2/桶下文件夹";
     ```
     
    
 
