更新时间:2022-02-22 GMT+08:00

添加分区(只支持OBS表)

功能描述

创建OBS分区表成功后,OBS表实际还没有生成分区信息。生成分区信息主要有以下两种场景:

  • 给OBS分区表插入对应的分区数据,数据插入成功后OBS表才会生成分区元数据信息,后续则可以根据对应分区列进行查询等操作。
  • 手工拷贝分区目录和数据到OBS分区表路径下,执行本章节介绍的分区添加命令生成分区元数据信息,后续即可根据对应分区列进行查询等操作。

本章节重点介绍使用ALTER TABLE命令添加分区的基本操作和使用说明。

语法格式

1
2
3
4
5
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 参数描述

参数

描述

table_name

表名称。

partition_specs

分区字段。

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表时仅有一个分区列,建表成功后添加分区数据。
    1. 先使用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);
    2. 拷贝分区数据目录到obs://bucketName/datapath路径下。例如当前拷贝external_data=22的分区目录下所有文件到obs://bucketName/datapath路径下。
    3. 执行添加分区命令,将分区的元数据信息生效。
      ALTER TABLE testobstable ADD
        PARTITION (external_data='22')
        LOCATION 'obs://bucketName/datapath/external_data=22';
    4. 添加分区成功后,即可根据分区列进行数据查询等操作。
      select * from testobstable where external_data='22';
  • 建OBS表时有多个分区列,建表成功后添加分区数据。
    1. 先使用DataSource语法创建一个OBS分区表,分区列为external_data和dt,数据存储在obs://bucketName/datapath路径下。
      1
      2
      3
      4
      5
      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);
      
    2. 拷贝分区数据目录到obs://bucketName/datapath路径下。例如拷贝external_data=22及其子目录dt=2021-07-27和目录下文件到obs://bucketName/datapath路径下。
    3. 执行添加分区命令,将分区的元数据信息生效。
      1
      2
      3
      4
      ALTER TABLE
        testobstable
      ADD
        PARTITION (external_data = '22', dt = '2021-07-27') LOCATION 'obs://bucketName/datapath/external_data=22/dt=2021-07-27';
      
    4. 添加分区成功后,即可根据分区列进行数据查询等操作。
      1
      2
      select * from testobstable where external_data = '22';
      select * from testobstable where external_data = '22' and dt='2021-07-27';