1.9.1 添加分区(只支持 OBS 表)
功能描述
创建OBS分区表成功后,OBS表实际还没有生成分区信息。生成分区信息主要有以下 两种场景:
● 给OBS分区表插入对应的分区数据,数据插入成功后OBS表才会生成分区元数据 信息,后续则可以根据对应分区列进行查询等操作。
● 手工拷贝分区目录和数据到OBS分区表路径下,执行本章节介绍的分区添加命令 生成分区元数据信息,后续即可根据对应分区列进行查询等操作。
本章节重点介绍使用ALTER TABLE命令添加分区的基本操作和使用说明。
语法格式
ALTER TABLE table_name ADD [IF NOT EXISTS]
PARTITION partition_specs1 [LOCATION 'obs_path1']
PARTITION partition_specs2 [LOCATION 'obs_path2'];
关键字
● IF NOT EXISTS:指定该关键字以避免分区重复添加时报错。
● PARTITION:分区。
● LOCATION:分区路径。
参数说明
表1-24 参数描述
参数 描述
table_name 表名称。
partition_sp
ecs 分区字段。
obs_path OBS存储路径。
注意事项
● 向表中添加分区时,此表和分区列(建表时PARTITIONED BY指定的列)必须已存 在,而所要添加的分区不能重复添加,否则将出错。已添加的分区可通过IF NOT EXISTS避免报错。
● 若分区表是按照多个字段进行分区的,添加分区时需要指定所有的分区字段,指 定字段的顺序可任意。
● “partition_specs”中的参数默认带有“( )”,例如:PARTITION (dt='2009-09-09',city='Shanghai')。
● 在添加分区时若指定OBS路径,则该OBS路径必须是已经存在的,否则会出错。
● 若添加多个分区,每组PARTITION partition_specs LOCATION 'obs_path'之间用 空格隔开。例如:
PARTITION partition_specs LOCATION 'obs_path' PARTITION partition_specs LOCATION 'obs_path'。
● 若新增分区指定的路径包含子目录(或嵌套子目录),则子目录下面的所有文件 类型及内容也将作为该分区的记录。用户需要保证该分区目录下所有文件类型和 文件内容与表的字段一致,否则查询将报错。
示例
● 建OBS表时仅有一个分区列,建表成功后添加分区数据。
a. 先使用DataSource语法创建一个OBS分区表,分区列为external_data,数据 存储在obs://bucketName/datapath路径下。
create table testobstable(id varchar(128), external_data varchar(16)) using JSON OPTIONS (path 'obs://bucketName/datapath') PARTITIONED by (external_data);
b. 拷贝分区数据目录到obs://bucketName/datapath路径下。例如当前拷贝 external_data=22的分区目录下所有文件到obs://bucketName/datapath路径 下。
c. 执行添加分区命令,将分区的元数据信息生效。
ALTER TABLE testobstable ADD PARTITION (external_data='22')
LOCATION 'obs://bucketName/datapath/external_data=22';
d. 添加分区成功后,即可根据分区列进行数据查询等操作。
select * from testobstable where external_data='22';
● 建OBS表时有多个分区列,建表成功后添加分区数据。
a. 先使用DataSource语法创建一个OBS分区表,分区列为external_data和dt,
数据存储在obs://bucketName/datapath路径下。
create table testobstable(
id varchar(128),
external_data varchar(16), dt varchar(16)
) using JSON OPTIONS (path 'obs://bucketName/datapath') PARTITIONED by (external_data, dt);
b. 拷贝分区数据目录到obs://bucketName/datapath路径下。例如拷贝 external_data=22及其子目录dt=2021-07-27和目录下文件到obs://
bucketName/datapath路径下。
c. 执行添加分区命令,将分区的元数据信息生效。
ALTER TABLE testobstable
ADD PARTITION (external_data = '22', dt = '2021-07-27') LOCATION 'obs://bucketName/datapath/
external_data=22/dt=2021-07-27';
d. 添加分区成功后,即可根据分区列进行数据查询等操作。
select * from testobstable where external_data = '22';
select * from testobstable where external_data = '22' and dt='2021-07-27';
1.9.2 重命名分区
功能描述
重命名分区。
语法格式
ALTER TABLE table_name PARTITION partition_specs
RENAME TO PARTITION partition_specs;
关键字
● PARTITION:分区。
● RENAME:重命名。
参数说明
表1-25 参数描述
参数 描述
table_name 表名称。
partition_spec
s 分区字段。
注意事项
● 所要重命名分区的表和分区必须已存在,否则会出错。新分区名不能与其他分区 重名,否则将出错。
● 若分区表是按照多个字段进行分区的,重命名分区时需要指定所有的分区字段,
指定字段的顺序可任意。
● “partition_specs”中的参数默认带有“( )”,例如:PARTITION (dt='2009-09-09',city='Shanghai')。
示例
将student表中的分区city='Hangzhou',dt='2008-08-08'重命名为 city='Wenzhou',dt='2009-09-09'。
ALTER TABLE student
PARTITION (city='Hangzhou',dt='2008-08-08')
RENAME TO PARTITION (city='Wenzhou',dt='2009-09-09');
1.9.3 删除分区
功能描述
删除分区表的一个或多个分区。
注意事项
● 所要删除分区的表必须是已经存在的表,否则会出错。
● 所要删除的分区必须是已经存在的,否则会出错,可通过语句中添加IF EXISTS避 免该错误。
语法格式
ALTER TABLE [db_name.]table_name DROP [IF EXISTS]
PARTITION partition_spec1[,PARTITION partition_spec2,...];
关键字
● DROP:删除表分区。
● IF EXISTS:所要删除的分区必须是已经存在的,否则会出错。
● PARTITION:分区。
参数说明
表1-26 参数描述
参数 描述
db_name Database名称,由字母、数字和下划线(_)组成。不能是纯数 字,且不能以下划线开头。
table_name Database中的表名,由字母、数字和下划线(_)组成。不能是纯 数字,且不能以下划线开头。匹配规则为:^(?!_)(?![0-9]+$)[A-Za-z0-9_$]*$。如果特殊字符需要使用单引号('')包围起来。
partition_spec
s 分区信息,key=value形式,key为分区字段,value为分区值。若 分区字段为多个字段,可以不包含所有的字段,会删除匹配上的所 有分区。“partition_specs”中的参数默认带有“( )”,例如:
PARTITION (dt='2009-09-09',city='Shanghai')。
示例
将分区表student的分区dt = '2008-08-08', city = 'Hangzhou'删除。
ALTER TABLE student DROP
PARTITION (dt = '2008-08-08', city = 'Hangzhou');
1.9.4 指定筛选条件删除分区
功能描述
指定筛选条件删除分区表的一个或多个分区。
注意事项
● 该命令仅支持操作OBS表,不支持对DLI表进行操作。
● 所要删除分区的表必须是已经存在的表,否则会出错。
● 所要删除的分区必须是已经存在的,否则会出错,可通过语句中添加IF EXISTS避 免该错误。
语法格式
ALTER TABLE [db_name.]table_name DROP [IF EXISTS]
PARTITIONS partition_filtercondition;
关键字
● DROP:删除表分区。
● IF EXISTS:所要删除的分区必须是已经存在的,否则会出错。
● PARTITIONS:分区。
参数说明
表1-27 参数描述
参数 描述
db_name Database名称,由字母、数字和下划线(_)组成。不能是纯数 字,且不能以下划线开头。
table_name Database中的表名,由字母、数字和下划线(_)组成。不能是纯 数字,且不能以下划线开头。匹配规则为:^(?!_)(?![0-9]+$)[A-Za-z0-9_$]*$。如果特殊字符需要使用单引号('')包围起来。
该命令仅支持操作OBS表,不支持对DLI表进行操作。
partition_filter
condition 分区筛选条件。具体可以为以下格式:
● <分区列名> <运算符> <分区列比较值>
例如:start_date < '201911'
● <partition_filtercondition1> AND|OR
<partition_filtercondition2>
例如:start_date < '201911' OR start_date >= '202006'
● (<partition_filtercondition1>)[,partitions (<partition_filtercondition2>), ...]
例如:(start_date <> '202007'), partitions(start_date <
'201912')
示例
将分区表student的分区dt,按照各种筛选过滤条件删除。
alter table student drop partitions(start_date < '201911');
alter table student drop partitions(start_date >= '202007');
alter table student drop partitions(start_date BETWEEN '202001' AND '202007');
alter table student drop partitions(start_date < '201912' OR start_date >= '202006');
alter table student drop partitions(start_date > '201912' AND start_date <= '202004');
alter table student drop partitions(start_date != '202007');
alter table student drop partitions(start_date <> '202007');
alter table student drop partitions(start_date <> '202007'), partitions(start_date < '201912');
1.9.5 修改表分区位置(只支持 OBS 表)
功能描述
修改表分区的位置。
语法格式
ALTER TABLE table_name PARTITION partition_specs SET LOCATION obs_path;
关键字
● PARTITION:分区。
● LOCATION:分区路径。
参数说明
表1-28 参数描述
参数 描述
table_name 表名称。
partition_spe
cs 分区字段。
obs_path OBS存储路径。
注意事项
● 所要修改位置的表分区必须是已经存在的,否则将报错。
● “partition_specs”中的参数默认带有“( )”,例如:PARTITION (dt='2009-09-09',city='Shanghai')。
● 所指定的新的OBS路径必须是已经存在的绝对路径,否则将报错。
● 若新增分区指定的路径包含子目录(或嵌套子目录),则子目录下面的所有文件 类型及内容也将作为该分区的记录。用户需要保证该分区目录下所有文件类型和 文件内容与表的字段一致,否则查询将报错。
示例
将student表的分区dt='2008-08-08',city='Hangzhou'的OBS路径设置为“obs://
bucketName/fileName/student/dt=2008-08-08/city=Hangzhou_bk”。
ALTER TABLE student
PARTITION(dt='2008-08-08',city='Hangzhou')
SET LOCATION 'obs://bucketName/fileName/student/dt=2008-08-08/city=Hangzhou_bk';
1.9.6 修改表分区 SerDe 属性(只支持 OBS 表)
功能描述
修改表分区Serde属性。
语法格式
ALTER TABLE table_name [PARTITION partition_specs]
SET SERDE serde
[WITH SERDEPROPERTIES (property_name=property_value,...)];
ALTER TABLE table_name [PARTITION partition_specs]
SET SERDEPROPERTIES (property_name=property_value,...);
关键字
● PARTITION:分区。
● SERDEPROPERTIES:Serde属性。
参数说明
表1-29 参数描述
参数 描述
table_name 表名称。
partition_spec
s 分区字段。
obs_path OBS存储路径。
注意事项
● 假如Serde属性已经存在,新的值将会覆盖老的值。
● 仅允许针对OBS表设置Serde属性。
示例
alter table test
set serdeproperties (creator = "test");
1.9.7 更新表分区信息(只支持 OBS 表)
功能描述
更新表在元数据库中的分区信息。
语法格式
MSCK REPAIR TABLE table_name;
或
ALTER TABLE table_name RECOVER PARTITIONS;
关键字
● PARTITIONS:分区。
● SERDEPROPERTIES:Serde属性。
参数说明
表1-30 参数描述
参数 描述
table_name 表名称。
partition_spe
cs 分区字段。
obs_path OBS存储路径。
注意事项
● 该命令的主要应用场景是针对分区表,如当手动在OBS上面添加分区目录时,再 通过上述命令将该新增的分区信息刷新到元数据库中,通过“SHOW
PARTITIONS table_name”命令查看新增的分区。
● 分区目录名称必须按照指定的格式输入,即“tablepath/
partition_column_name=partition_column_value”。
示例
下述两语句都将更新表ptable在元数据库中的分区信息。
MSCK REPAIR TABLE ptable;
或
ALTER TABLE ptable RECOVER PARTITIONS;
1.9.8 REFRESH TABLE 刷新表元数据
功能描述
Spark为了提高性能会缓存Parquet的元数据信息。当更新了Parquet表时,缓存的元数 据信息未更新,导致Spark SQL查询不到新插入的数据作业执行报错,报错信息参考如 下:DLI.0002: FileNotFoundException: getFileStatus on error message
该场景下就需要使用REFRESH TABLE来解决该问题。REFRESH TABLE是用于重新整理 某个分区的文件,重用之前的表元数据信息,能够检测到表的字段的增加或者减少,
主要用于表中元数据未修改,表的数据修改的场景。
语法格式
REFRESH TABLE [db_name.]table_name;
关键字
无。
参数说明
表1-31 参数描述
参数 描述
db_name Database名称,由字母、数字和下划线(_)组成。不能是纯数 字,且不能以下划线开头。
table_name 表名称。Database中的表名,由字母、数字和下划线(_)组成。
不能是纯数字,且不能以下划线开头。匹配规则为:^(?!_)(?!
[0-9]+$)[A-Za-z0-9_$]*$。如果特殊字符需要使用单引号('')包围 起来。
注意事项
无。
示例
刷新表test的元数据信息。
REFRESH TABLE test;