• 沒有找到結果。

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;