更新时间:2024-08-16 GMT+08:00

创建Hive表

功能介绍

本小节介绍了如何使用HQL创建内部表、外部表的基本操作。创建表主要有以下三种方式。

  • 自定义表结构,以关键字EXTERNAL区分创建内部表和外部表。
    • 内部表,如果对数据的处理都由Hive完成,则应该使用内部表。在删除内部表时,元数据和数据一起被删除。
    • 外部表,如果数据要被多种工具共同处理,则应该使用外部表,可避免对该数据的误操作。删除外部表时,只删除掉元数据。
  • 根据已有表创建新表,使用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"指定列与列之间的分隔符为',',"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;
  • HIVE使用OBS存储。

    需要在beeline里面设置指定的参数,AK/SK可登录“OBS控制台”,进入“我的凭证”页面获取。

    set fs.obs.access.key=AK;
    set fs.obs.secret.key=SK;
    set metaconf:fs.obs.access.key=AK;
    set metaconf:fs.obs.secret.key=SK;

    新建表的存储类型为obs。

    create table obs(c1 string, c2 string) stored as orc location 'obs://obs-lmm/hive/orctest' tblproperties('orc.compress'='SNAPPY');

    当前Hive使用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/桶下文件夹";