
# 创建Hive表
#### 功能介绍
本小节介绍了如何使用HQL创建内部表、外部表的基本操作。创建表主要有以下三种方式：
- 自定义表结构，以关键字EXTERNAL区分创建内部表和外部表。
  - 内部表，如果对数据的处理都由Hive完成，则应该使用内部表。在删除内部表时，元数据和数据一起被删除。
  
  - 外部表，如果数据要被多种工具（如Pig等）共同处理，则应该使用外部表，可避免对该数据的误操作。删除外部表时，只删除掉元数据。
   
- 根据已有表创建新表，使用CREATE LIKE句式，完全复制原有的表结构，包括表的存储格式。
- 根据查询结果创建新表，使用CREATE AS SELECT句式。 这种方式比较灵活，可以在复制原表表结构的同时指定要复制哪些字段，不包括表的存储格式。
  
![](https://support.huaweicloud.com/devg-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
- 在启用了安全服务的集群中执行如下操作，需要在数据库中CREATE权限，使用CREATE AS SELECT句式创建表，需要对SELECT查询的表具有SELECT权限。
- 目前表名长度最长为128，字段名长度最长为128，字段注解长度最长为4000，WITH SERDEPROPERTIES 中key长度最长为256，value长度最长为4000。以上的长度均表示字节长度。
 
#### 样例代码
```
-- 创建外部表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"指定列与列之间的分隔符为','，"MAP KEYS TERMINATED BY"指定MAP中键值的分隔符为'&'. 
ROW FORMAT delimited fields terminated by ',' MAP KEYS TERMINATED BY '&'  
-- 指定表的存储格式为TEXTFILE. 
STORED AS TEXTFILE;  
 
-- 使用CREATE Like创建表. 
CREATE TABLE employees_like LIKE employees_info; 
 
-- 使用DESCRIBE查看employees_info、employees_like、 employees_as_select表结构. 
DESCRIBE employees_info; 
DESCRIBE employees_like;
```
#### 扩展应用
- 创建分区表 一个表可以拥有一个或者多个分区，每个分区以文件夹的形式单独存在表文件夹的目录下。对分区内数据进行查询，可缩小查询范围，加快数据的检索速度和可对数据按照一定的条件进行管理。
  分区是在创建表的时候用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);
  ```
  
- 建表时配置Hive数据加密 指定表的格式为RCFile（推荐使用）或SequenceFile，加密算法为ARC4Codec。SequenceFile是Hadoop特有的文件格式，RCFile是Hive优化的文件格式。RCFile优化了列存储，在对大表进行查询时，综合性能表现比SequenceFile更优。
  ```
  set hive.exec.compress.output=true; 
   set hive.exec.compress.intermediate=true; 
   set hive.intermediate.compression.codec=org.apache.hadoop.io.encryption.arc4.ARC4Codec; 
   create table seq_Codec (key string, value string) stored as RCFile;
  ```
  
 
