首批通过分布式安全可靠测评,为关键业务系统打造
创建外表分区
更新时间:2026-04-30 18:56:46
自动创建外表分区
自动分区外表建表语法如下:
CREATE EXTERNAL TABLE
<table_name>
( <part_col_name> <col_type> AS <part_expr> )
[ , ... ]
[ PARTITION BY ( <part_col_name> [, <part_col_name> ... ] ) ]
..
相关参数说明如下:
PARTITION BY用于指定一个或多个分区列。
使用示例
假如存在如下的一个文件目录,需要用分区外表管理组织如下的文件。 外表支持 CSV、PARQUET、 ORC 三种数据文件格式。本示例中使用 CSV 格式。
external_table_mock_log
├── 2023-06-01
│ ├── server_log1.csv
│ └── server_log2.csv
├── 2023-06-02
│ └── server_log1.csv
├── 2023-06-03
│ ├── server_log1.csv
│ ├── server_log2.csv
│ └── server_log3.csv
└── 2023-07-01
└── server_log1.csv
文件的内容如下:
2023-06-01 14:42:37.568624, INTERNAL ERROR, -4007, Not supported
2023-06-01 14:42:38.861356, ITER END, -4008, traverse map failed
2023-06-01 14:42:39.931161, NEED WAIT, -4076, query and update last id fail
2023-06-01 14:42:39.931161, SUCCESS, 0, do flush cache success
可以通过创建自动分区外表来访问该目录文件:
obclient> create external table ex_t1 (
time datetime,
errstate varchar(30),
errcode int,
errcontent varchar(100),
date_key datetime as (substr(substr(metadata$fileurl, instr(metadata$fileurl, '%') + 1), 1, 10))
)
location='external_table_mock_log'
FORMAT (
type = 'csv',
field_delimiter = ',',
SKIP_BLANK_LINES = TRUE
)
partition by (date_key)
;
METADATA$FILEURL列中记录的是路径和文件名信息。如本地文件会返回ip:port%2023-06-01/server_log2.csv;如果是 OSS 存储则返回2023-06-01/server_log2.csv。
该示例中使用分区键 date_key 将其中记录的日期字段分割出来。按照日期对文件进行分区。 您在查询时,可以指定分区键的值或者范围。此时会进行分区裁剪,外表只会读取该分区下的文件。
obclient> select * from ex_t1 where date_key = '2023-06-01';
手动创建外表分区
手动外表分区语法如下:
CREATE EXTERNAL TABLE
<table_name>
( <part_col_name> <col_type> AS <part_expr> )
[ , ... ]
[ PARTITION BY ( <part_col_name> [, <part_col_name> ... ] ) ]
PARTITION_TYPE = USER_SPECIFIED
当您需要自己手动添加和删除分区,而不是让外表自动管理分区时,需要指定 PARTITION_TYPE = USER_SPECIFIED 字段。
使用示例
文件目录与上述自动分区示例中的相同,对应的可以创建手动分区外表:
示例 1
外表支持 CSV、PARQUET、 ORC 三种数据文件格式。
您可以执行如下命令创建 CSV 类型的外表分区:
obclient> create external table ex_t1 (
time datetime,
errstate varchar(30),
errcode int,
errcontent varchar(100),
date_key datetime as (metadata$partition_list_col1)
)
location='external_table_mock_log'
PARTITION_TYPE = USER_SPECIFIED
FORMAT (
type = 'csv',
field_delimiter = ',',
SKIP_BLANK_LINES = TRUE
)
partition by (date_key)
;
metadata$partition_list_col指定该列为外表分区键的第几列,与partition by里的顺序对应。
执行如下语句,通过手动添加分区的方式添加分区,将 2023-06-01 子目录下的文件加入分区。且该分区分区键的值也被设置为 2023-06-01,这个值您可以任意指定。
obclient> alter external table ex_t1 add partition
(date_key = '2023-06-01' ) location '2023-06-01';
您也可以执行如下语句,将添加的分区删除。
obclient> alter external table ex_t1 drop partition location '2023-06-01';
示例 2
外表支持 CSV、PARQUET、 ORC 三种数据文件格式。
您可以通过如下命令创建 PARQUET 类型的外表分区:
obclient> create external table lineitem_part
(
l_orderkey int,
l_partkey int,
l_suppkey int,
l_linenumber int,
l_quantity decimal(15,2),
l_extendedprice decimal(15,2),
l_discount decimal(15,2),
l_tax decimal(15,2),
l_returnflag char(1),
l_linestatus char(1),
l_shipdate date,
l_commitdate date,
l_receiptdate date,
l_shipinstruct char(25),
l_shipmode char(10),
l_comment varchar(44),
l_shipyear varchar(4) as (substr(metadata$fileurl, instr(metadata$fileurl, '%') + 1, 4))
) location 'file:///data/external_data/lineitem_part'
format (
type = 'parquet'
)
partition by(l_shipyear);
Query OK, 0 rows affected (0.126 sec)
示例 3
外表支持 CSV、PARQUET、 ORC 三种数据文件格式。
您可以执行如下命令创建 ORC 类型的外表分区:
obclient> create external table lineitem_part
(
l_orderkey int,
l_partkey int,
l_suppkey int,
l_linenumber int,
l_quantity decimal(15,2),
l_extendedprice decimal(15,2),
l_discount decimal(15,2),
l_tax decimal(15,2),
l_returnflag char(1),
l_linestatus char(1),
l_shipdate date,
l_commitdate date,
l_receiptdate date,
l_shipinstruct char(25),
l_shipmode char(10),
l_comment varchar(44),
l_shipyear varchar(4) as (substr(metadata$fileurl, instr(metadata$fileurl, '%') + 1, 4))
) location 'file:///data/external_data/lineitem_part'
format (
type = 'orc'
)
partition by(l_shipyear);
Query OK, 0 rows affected (0.126 sec)