---
title: "创建外表分区 - OceanBase 数据库 V4.6.0 | OceanBase 文档中心"
description: "创建外表分区 自动创建外表分区 自动分区外表建表语法如下： CREATE EXTERNAL TABLE &lt;table_name&gt; ( &lt;part_col_name&gt; &lt;col_type&gt; AS &lt;part_expr&gt; ) [ , ... ] [ PARTITION BY ( &lt;part_col_name&gt; [, &lt;p…"
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.6.0

# 创建外表分区

更新时间：2026-05-30 14:17:04

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.6.0/zh-CN/700.reference/300.database-object-management/200.manage-object-of-oracle-mode/100.manage-tables-of-oracle-mode/1000.manage-external-tables-of-oracle-mode/210.create-table-partition-of-oracle-mode.md)  

## 自动创建外表分区

自动分区外表建表语法如下：

```sql
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 格式。

```sql
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

```

文件的内容如下：

```sql
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

```

可以通过创建自动分区外表来访问该目录文件：

```sql
obclient> create external table ex_t1 (
time date,
errstate varchar2(30),
errcode int,
errcontent varchar2(100),
date_key date 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` 将其中记录的日期字段分割出来。按照日期对文件进行分区。 您在查询时，可以指定分区键的值或者范围。此时会进行分区裁剪，外表只会读取该分区下的文件。

```sql
obclient> select * from ex_t1 where date_key = '2023-06-01';

```

## 手动创建外表分区

手动外表分区语法如下：

```sql
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 类型的外表分区：

```shell
obclient> create external table ex_t1 (
time date,
errstate varchar2(30),
errcode int,
errcontent varchar2(100),
date_key date 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`，这个值您可以任意指定。

```shell
alter external table ex_t1 add partition
(date_key = '2023-06-01' ) location '2023-06-01';

```

您也可以执行如下语句，将添加的分区删除。

```shell
alter external table ex_t1 drop partition location '2023-06-01';

```

**示例 2**

您可以通过如下命令创建 PARQUET 类型的外表分区:

```shell
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**

您可以执行如下命令创建 ORC 类型的外表分区：

```shell
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);

```

## 相关文档

- [ALTER EXTERNAL TABLE](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005687544)
 - [CREATE EXTERNAL TABLE](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000005687522)

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
