创建Impala表
功能简介
本小节介绍了如何使用Impala SQL建内部表、外部表的基本操作。创建表主要有以下三种方式。
样例代码
-- 创建外部表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存储。
需要在集群管理页面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');
当前Impala使用OBS存储时,同一张表中,不支持分区和表存储位置处于不同的桶中。
例如:创建分区表指定存储位置为OBS桶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/桶下文件夹";
- 修改此表分区位置到另外一个桶下,此时该修改不会生效。
alter table table_name partition(dt date) set location "obs://OBS桶2/桶下文件夹";
- 创建分区表并指定表存储路径。