

# DDL 语句
<a name="ddl-reference"></a>

请使用此处直接在 Athena 中显示的支持的数据定义语言（DDL）语句。Athena 查询引擎基于 [HiveQL DDL](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL)。Athena 并不支持所有 DDL 语句，并且 HiveQL DDL 和 Athena DDL 之间存在一些差异。有关更多信息，请参阅本部分中的参考主题和 [不支持的 DDL](unsupported-ddl.md)。

**Topics**
+ [不支持的 DDL](unsupported-ddl.md)
+ [ALTER DATABASE SET DBPROPERTIES](alter-database-set-dbproperties.md)
+ [ALTER TABLE ADD COLUMNS](alter-table-add-columns.md)
+ [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)
+ [ALTER TABLE CHANGE COLUMN](alter-table-change-column.md)
+ [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md)
+ [ALTER TABLE RENAME PARTITION](alter-table-rename-partition.md)
+ [ALTER TABLE REPLACE COLUMNS](alter-table-replace-columns.md)
+ [ALTER TABLE SET LOCATION](alter-table-set-location.md)
+ [ALTER TABLE SET TBLPROPERTIES](alter-table-set-tblproperties.md)
+ [ALTER VIEW DIALECT](alter-view-dialect.md)
+ [CREATE DATABASE](create-database.md)
+ [CREATE TABLE](create-table.md)
+ [CREATE TABLE AS](create-table-as.md)
+ [CREATE VIEW](create-view.md)
+ [DESCRIBE](describe-table.md)
+ [DESCRIBE VIEW](describe-view.md)
+ [DROP DATABASE](drop-database.md)
+ [DROP TABLE](drop-table.md)
+ [DROP VIEW](drop-view.md)
+ [MSCK REPAIR TABLE](msck-repair-table.md)
+ [SHOW COLUMNS](show-columns.md)
+ [SHOW CREATE TABLE](show-create-table.md)
+ [SHOW CREATE VIEW](show-create-view.md)
+ [SHOW DATABASES](show-databases.md)
+ [SHOW PARTITIONS](show-partitions.md)
+ [SHOW TABLES](show-tables.md)
+ [SHOW TBLPROPERTIES](show-tblproperties.md)
+ [SHOW VIEWS](show-views.md)

# 不支持的 DDL
<a name="unsupported-ddl"></a>

Athena SQL 不支持以下 DDL 语句。有关 Athena 中 Iceberg 表支持的 DDL 语句，请参阅 [Iceberg 表架构演进](querying-iceberg-evolving-table-schema.md) 和 [对 Iceberg 表这些其他 DDL 操作](querying-iceberg-additional-operations.md)。
+ ALTER INDEX
+ ALTER TABLE *table\$1name* ARCHIVE PARTITION
+ ALTER TABLE *table\$1name* CLUSTERED BY
+ ALTER TABLE *table\$1name* DROP COLUMN（支持 Iceberg 表）
+ ALTER TABLE *table\$1name* EXCHANGE PARTITION
+ ALTER TABLE *table\$1name* NOT CLUSTERED
+ ALTER TABLE *table\$1name* NOT SKEWED
+ ALTER TABLE *table\$1name* NOT SORTED
+ ALTER TABLE *table\$1name* NOT STORED AS DIRECTORIES
+ ALTER TABLE *table\$1name* partitionSpec CHANGE COLUMNS
+ ALTER TABLE *table\$1name* partitionSpec COMPACT
+ ALTER TABLE *table\$1name* partitionSpec CONCATENATE
+ ALTER TABLE *table\$1name* partitionSpec SET FILEFORMAT
+ ALTER TABLE *table\$1name* RENAME TO（支持 Iceberg 表）
+ ALTER TABLE *table\$1name* SET SERDEPROPERTIES
+ ALTER TABLE *table\$1name* SET SKEWED LOCATION
+ ALTER TABLE *table\$1name* SKEWED BY
+ ALTER TABLE *table\$1name* TOUCH
+ ALTER TABLE *table\$1name* UNARCHIVE PARTITION
+ COMMIT
+ CREATE INDEX
+ CREATE ROLE
+ CREATE TABLE *table\$1name* LIKE *existing\$1table\$1name* 
+ CREATE TEMPORARY MACRO
+ DELETE FROM
+ DESCRIBE DATABASE
+ DFS
+ DROP INDEX
+ DROP ROLE
+ DROP TEMPORARY MACRO
+ EXPORT TABLE
+ GRANT ROLE
+ IMPORT TABLE
+ LOCK DATABASE
+ LOCK TABLE
+ REVOKE ROLE
+ ROLLBACK
+ SHOW COMPACTIONS
+ SHOW CURRENT ROLES
+ SHOW GRANT
+ SHOW INDEXES
+ SHOW LOCKS
+ SHOW PRINCIPALS
+ SHOW ROLE GRANT
+ SHOW ROLES
+ SHOW STATS
+ SHOW TRANSACTIONS
+ START TRANSACTION
+ UNLOCK DATABASE
+ UNLOCK TABLE

# ALTER DATABASE SET DBPROPERTIES
<a name="alter-database-set-dbproperties"></a>

为数据库创建一个或多个属性。`DATABASE` 和 `SCHEMA` 的使用是可互换的；它们具有相同的含义。

## 摘要
<a name="synopsis"></a>

```
ALTER {DATABASE|SCHEMA} database_name
  SET DBPROPERTIES ('property_name'='property_value' [, ...] )
```

## 参数
<a name="parameters"></a>

**SET DBPROPERTIES ('property\$1name'='property\$1value' [, ...]**  
为名为 `property_name` 的数据库指定一个或多个属性，并分别将每个属性的值设置为 `property_value`。如果 `property_name` 已存在，则会用 `property_value` 覆盖旧值。

## 示例
<a name="examples"></a>

```
ALTER DATABASE jd_datasets
  SET DBPROPERTIES ('creator'='John Doe', 'department'='applied mathematics');
```

```
ALTER SCHEMA jd_datasets
  SET DBPROPERTIES ('creator'='Jane Doe');
```

# ALTER TABLE ADD COLUMNS
<a name="alter-table-add-columns"></a>

向现有表添加一个或多个列。使用可选 `PARTITION` 语法时，将更新分区元数据。

## 摘要
<a name="synopsis"></a>

```
ALTER TABLE table_name 
  [PARTITION 
   (partition_col1_name = partition_col1_value
   [,partition_col2_name = partition_col2_value][,...])]
  ADD COLUMNS (col_name data_type)
```

## 参数
<a name="parameters"></a>

**PARTITION (partition\$1col\$1name = partition\$1col\$1value [,...])**  
创建一个具有指定列名称/值组合的分区。仅当列的数据类型为字符串时，才将 `partition_col_value` 包含在引号中。

**ADD COLUMNS (col\$1name data\$1type [,col\$1name data\$1type,...])**  
在现有列之后但在分区列之前添加列。

## 示例
<a name="examples"></a>

```
ALTER TABLE events ADD COLUMNS (eventowner string)
```

```
ALTER TABLE events PARTITION (awsregion='us-west-2') ADD COLUMNS (event string)
```

```
ALTER TABLE events PARTITION (awsregion='us-west-2') ADD COLUMNS (eventdescription string)
```

## 注意
<a name="alter-table-add-columns-notes"></a>
+ 要在运行 `ALTER TABLE ADD COLUMNS` 后在 Athena 查询编辑器导航窗格中查看新的表列，请手动刷新编辑器中的表列表，然后重新展开表。
+ `ALTER TABLE ADD COLUMNS` 不适用于具有 `date` 数据类型的列。若要解决此问题，请使用 `timestamp` 数据类型。

# ALTER TABLE ADD PARTITION
<a name="alter-table-add-partition"></a>

为表创建一个或多个分区列。每个分区包含一个或多个不同的列名称/值组合。将会为每个指定的组合创建一个单独的数据目录，这在某些情况下可提高查询性能。分区列在表数据本身中不存在，因此如果您使用的列名称与表本身的列同名，则会出现错误。有关更多信息，请参阅 [对您的数据进行分区](partitions.md)。

在 Athena 中，一个表及其分区必须使用相同的数据格式，但它们的架构可以不同。有关更多信息，请参阅 [更新包含分区的表](updates-and-partitions.md)。

有关 IAM 策略中需要的资源级权限（包括 `glue:CreatePartition`），请参阅 [AWS Glue API 权限：操作和资源参考](https://docs.aws.amazon.com/glue/latest/dg/api-permissions-reference.html)以及 [在 AWS Glue Data Catalog 中配置对数据库和表的访问](fine-grained-access-to-glue-resources.md)。有关使用 Athena 时权限相关的疑难解答信息，请参阅 [在 Athena 中进行排查问题](troubleshooting-athena.md) 主题的 [权限](troubleshooting-athena.md#troubleshooting-athena-permissions) 部分。

## 摘要
<a name="synopsis"></a>

```
ALTER TABLE table_name ADD [IF NOT EXISTS]
  PARTITION
  (partition_col1_name = partition_col1_value
  [,partition_col2_name = partition_col2_value]
  [,...])
  [LOCATION 'location1']
  [PARTITION
  (partition_colA_name = partition_colA_value
  [,partition_colB_name = partition_colB_value
  [,...])]
  [LOCATION 'location2']
  [,...]
```

## 参数
<a name="parameters"></a>

添加分区时，您可以为分区指定一个或多个列名/值对，以及该分区的数据文件所在的 Amazon S3 路径。

**[IF NOT EXISTS]**  
如果已存在具有相同定义的分区，则会导致错误被隐藏。

**PARTITION (partition\$1col\$1name = partition\$1col\$1value [,...])**  
创建一个具有指定列名称/值组合的分区。仅当列的数据类型为字符串时，才将 `partition_col_value` 包含在字符串字符中。

**[LOCATION 'location']**  
指定存储前述语句所定义的分区的目录。当数据使用 Hive 样式分区 (`pk1=v1/pk2=v2/pk3=v3`) 时，`LOCATION` 子句为可选项。在 Hive 式分区中，完整的 Amazon S3 URI 是根据表的位置、分区键名称和分区键值自动构造的。有关更多信息，请参阅 [对您的数据进行分区](partitions.md)。

## 注意事项
<a name="alter-table-add-partition-considerations"></a>

Amazon Athena 并未对可以在单个 `ALTER TABLE ADD PARTITION` DDL 语句中添加的分区数量施加具体限制。不过，若是需要添加大量分区，可考虑多分几次进行添加，避免性能存在潜在问题。以下示例使用连续命令来分别添加分区，同时使用 `IF NOT EXISTS` 来避免添加重复分区。

```
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION (ds='2023-01-01')
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION (ds='2023-01-02')
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION (ds='2023-01-03')
```

 在 Athena 中使用分区时，还请记住以下几点：
+ 尽管 Athena 支持查询具有 1000 万个分区的 AWS Glue 表，但 Athena 的单次扫描读取量最多为 100 万个分区。
+ 要优化查询并减少扫描的分区数量，可考虑分区修剪或使用分区索引等策略。

有关在 Athena 中使用分区的其他注意事项，请参阅 [对您的数据进行分区](partitions.md)。

## 示例
<a name="examples"></a>

以下示例将单个分区添加至 Hive 样式分区数据表。

```
ALTER TABLE orders ADD
  PARTITION (dt = '2016-05-14', country = 'IN');
```

以下示例将多个分区添加至 Hive 样式分区数据表。

```
ALTER TABLE orders ADD
  PARTITION (dt = '2016-05-31', country = 'IN')
  PARTITION (dt = '2016-06-01', country = 'IN');
```

如果该表不适用于 Hive 样式分区数据，则 `LOCATION` 子句为必需项，并且应该是包含分区数据的前缀的完整 Amazon S3 URI。

```
ALTER TABLE orders ADD
  PARTITION (dt = '2016-05-31', country = 'IN') LOCATION 's3://amzn-s3-demo-bucket/path/to/INDIA_31_May_2016/'
  PARTITION (dt = '2016-06-01', country = 'IN') LOCATION 's3://amzn-s3-demo-bucket/path/to/INDIA_01_June_2016/';
```

要在已存在分区时忽略错误，使用 `IF NOT EXISTS` 子句，如以下示例所示。

```
ALTER TABLE orders ADD IF NOT EXISTS
  PARTITION (dt = '2016-05-14', country = 'IN');
```

## 零字节 `_$folder$` 文件
<a name="alter-table-add-partition-zero-byte-folder-files"></a>

如果您运行 `ALTER TABLE ADD PARTITION` 语句并错误地指定了已存在的分区和错误的 Simple Storage Service (Amazon S3) 位置，格式为 `partition_value_$folder$` 的零字节占位符文件将在 Simple Storage Service (Amazon S3) 中创建。您必须手动移除这些文件。

为了防止这种情况发生，在 `ALTER TABLE ADD PARTITION` 语句中使用 `ADD IF NOT EXISTS` 语法，如以下示例所示。

```
ALTER TABLE table_name ADD IF NOT EXISTS PARTITION […]
```

# ALTER TABLE CHANGE COLUMN
<a name="alter-table-change-column"></a>

更改表中列的名称、类型、顺序或注释。

## 摘要
<a name="alter-table-change-column-synopsis"></a>

```
ALTER TABLE [db_name.]table_name
  CHANGE [COLUMN] col_old_name col_new_name column_type 
  [COMMENT col_comment] [FIRST|AFTER column_name]
```

## 示例
<a name="alter-table-change-column-example"></a>

以下示例将列名 `area` 更改为 `zip`，将数据类型设为整数，并将重命名的列放在 `id` 列之后。

```
ALTER TABLE example_table CHANGE COLUMN area zip int AFTER id
```

以下示例向 `example_table` 的元数据中的 `zip` 列添加注释。要查看注释，请使用 AWS CLI [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/get-table-metadata.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/athena/get-table-metadata.html) 命令或访问 AWS Glue 控制台中表的架构。

```
ALTER TABLE example_table CHANGE COLUMN zip zip int COMMENT 'USA zipcode'
```

# ALTER TABLE DROP PARTITION
<a name="alter-table-drop-partition"></a>

为命名的表删除一个或多个指定的分区。

## 摘要
<a name="synopsis"></a>

```
ALTER TABLE table_name DROP [IF EXISTS] PARTITION (partition_spec) [, PARTITION (partition_spec)]
```

## 参数
<a name="alter-table-drop-partition-parameters"></a>

**[IF EXISTS]**  
如果指定的分区不存在，则会隐藏错误消息。

**PARTITION (partition\$1spec)**  
每个 `partition_spec` 以形式 `partition_col_name = partition_col_value [,...]` 指定列名称/值组合。

## 示例
<a name="alter-table-drop-partition-examples"></a>

```
ALTER TABLE orders 
DROP PARTITION (dt = '2014-05-14', country = 'IN');
```

```
ALTER TABLE orders 
DROP PARTITION (dt = '2014-05-14', country = 'IN'), PARTITION (dt = '2014-05-15', country = 'IN');
```

## 备注
<a name="alter-table-drop-partition-notes"></a>

`ALTER TABLE DROP PARTITION` 语句不提供一次性删除所有分区的单一语法，也不支持用于指定要删除的分区范围的筛选条件。

作为解决方法，您可以在脚本中使用 AWS Glue API [GetPartitions](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-partitions.html#aws-glue-api-catalog-partitions-GetPartitions) 和 [BatchDeletePartition](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-catalog-partitions.html#aws-glue-api-catalog-partitions-BatchDeletePartition) 操作。`GetPartitions` 操作支持复杂的筛选条件表达式，就像 SQL `WHERE` 表达式中的筛选条件表达式一样。使用 `GetPartitions` 创建要删除的分区的筛选列表后，您可以使用 `BatchDeletePartition` 操作批量删除 25 个分区。

# ALTER TABLE RENAME PARTITION
<a name="alter-table-rename-partition"></a>

重命名分区值。

**注意**  
ALTER TABLE RENAME PARTITION 不重命名分区列。要更改分区列名称，您可以使用 AWS Glue 控制台。有关更多信息，请参阅本文后面的[在 AWS Glue 中重命名分区列](#alter-table-rename-partition-column-name)。

## 摘要
<a name="synopsis"></a>

对于名为 `table_name` 的表，将 `partition_spec` 指定的分区值重命名为 `new_partition_spec` 指定的值。

```
ALTER TABLE table_name PARTITION (partition_spec) RENAME TO PARTITION (new_partition_spec)
```

## 参数
<a name="parameters"></a>

**PARTITION (partition\$1spec)**  
每个 `partition_spec` 以形式 `partition_col_name = partition_col_value [,...]` 指定列名称/值组合。

## 示例
<a name="examples"></a>

```
ALTER TABLE orders 
PARTITION (dt = '2014-05-14', country = 'IN') RENAME TO PARTITION (dt = '2014-05-15', country = 'IN');
```

## 在 AWS Glue 中重命名分区列
<a name="alter-table-rename-partition-column-name"></a>

使用以下过程在 AWS Glue 控制台中重命名分区列名。

**在 AWS Glue 控制台中重命名表分区列**

1. 登录 AWS 管理控制台，然后打开 AWS Glue 控制台，网址为：[https://console.aws.amazon.com/glue/](https://console.aws.amazon.com/glue/)。

1. 在导航窗格中，选择**表**。

1. 在**表**页面上，使用**筛选表**搜索框查找要更改的表。

1. 在**名称**列中，选择要更改的表的链接。

1. 在表的详细信息页上的**架构**部分中，执行以下操作之一：
   + 要以 JSON 格式更改名称，请选择**将架构编辑为 JSON**。
   + 要直接更改名称，请选择**编辑架构**。此过程选择**编辑架构**。

1. 选中要重命名的分区列的复选框，然后选择**编辑**。

1. 在**编辑架构条目**对话框中，在**名称**中输入分区列的新名称。

1. 选择**另存为新表版本**。此操作会更新分区列名并保留架构演变历史记录，而不创建数据的单独物理副本。

1. 要比较表版本，请在表的详细信息页面上，选择**操作**，然后选择**比较版本**。

## 其他资源
<a name="alter-table-rename-partition-additional-resources"></a>

 有关分区的更多信息，请参阅 [对您的数据进行分区](partitions.md)。

# ALTER TABLE REPLACE COLUMNS
<a name="alter-table-replace-columns"></a>

从使用 [LazySimpleSerDe](lazy-simple-serde.md) 创建的表中移除所有现有列并用指定的列集替换它们。使用可选 `PARTITION` 语法时，将更新分区元数据。您还可以通过仅指定要保留的列，使用 `ALTER TABLE REPLACE COLUMNS` 来删除列。

## 摘要
<a name="synopsis"></a>

```
ALTER TABLE table_name 
  [PARTITION 
   (partition_col1_name = partition_col1_value
   [,partition_col2_name = partition_col2_value][,...])]
  REPLACE COLUMNS (col_name data_type [, col_name data_type, ...])
```

## 参数
<a name="parameters"></a>

**PARTITION (partition\$1col\$1name = partition\$1col\$1value [,...])**  
指定一个具有指定列名称/值组合的分区。仅当列的数据类型为字符串时，才将 `partition_col_value` 包含在引号中。

**REPLACE COLUMNS (col\$1name data\$1type [,col\$1name data\$1type,...])**  
用指定的列名和数据类型替换现有列。

## 备注
<a name="alter-table-replace-columns-notes"></a>
+ 要在运行 `ALTER TABLE REPLACE COLUMNS` 后在 Athena 查询编辑器导航窗格中查看表列的更改，您可以手动刷新编辑器中的表列表，然后重新展开表。
+ `ALTER TABLE REPLACE COLUMNS` 不适用于具有 `date` 数据类型的列。若要解决此问题，请使用表中的 `timestamp` 数据类型。
+ 请注意，即使您只替换单个列，语法也必须是 `ALTER TABLE table-name REPLACE COLUMNS`，*columns*（列）是复数形式。您不仅必须指定要替换的列，还必须指定要保留的列，否则会删除未指定的列。这种语法和行为源自 Apache Hive DDL。有关参考，请参阅 Apache 文档中的[添加/替换列](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DDL#LanguageManualDDL-Add/ReplaceColumns)。

## 示例
<a name="alter-table-replace-columns-example"></a>

在以下示例中，使用 [LazySimpleSerDe](lazy-simple-serde.md) 创建的表 `names_cities` 具有三个名为 `col1`、`col2` 和 `col3` 的列。所有列均为 `string` 类型。要显示表中的列，以下命令应使用 [SHOW COLUMNS](show-columns.md) 语句。

```
SHOW COLUMNS IN names_cities
```

查询结果：

```
col1
col2
col3
```

以下 `ALTER TABLE REPLACE COLUMNS` 命令将列名替换为 `first_name`、`last_name` 和 `city`。底层源数据不受影响。

```
ALTER TABLE names_cities
REPLACE COLUMNS (first_name string, last_name string, city string)
```

要测试结果，请再次运行 `SHOW COLUMNS`。

```
SHOW COLUMNS IN names_cities
```

查询结果：

```
first_name
last_name
city
```

显示新列名的另一种方法是在 Athena 查询编辑器中[预览表](creating-tables-showing-table-information.md)或运行您自己的 `SELECT` 查询。

# ALTER TABLE SET LOCATION
<a name="alter-table-set-location"></a>

更改名为 `table_name` 的表的位置，以及 (可选) 包含 `partition_spec` 的分区。

## 摘要
<a name="synopsis"></a>

```
ALTER TABLE table_name [ PARTITION (partition_spec) ] SET LOCATION 'new location'
```

## 参数
<a name="alter-table-set-location-parameters"></a>

**PARTITION (partition\$1spec)**  
使用您要更改位置的参数 `partition_spec` 指定分区。`partition_spec` 以形式 `partition_col_name = partition_col_value` 指定列名称/值组合。

**SET LOCATION '新位置'**  
指定新的位置，且必须是 Amazon S3 位置。有关语法的信息，请参阅 [Amazon S3 中的表位置](tables-location-format.md)。

## 示例
<a name="alter-table-set-location-examples"></a>

```
ALTER TABLE customers PARTITION (zip='98040', state='WA') SET LOCATION 's3://amzn-s3-demo-bucket/custdata/';
```

# ALTER TABLE SET TBLPROPERTIES
<a name="alter-table-set-tblproperties"></a>

向表中添加自定义或预定义元数据属性并设置其分配的值。要查看表中的属性，请使用 [SHOW TBLPROPERTIES](show-tblproperties.md) 命令。

Apache Hive [托管表](https://cwiki.apache.org/confluence/display/Hive/Managed+vs.+External+Tables)不受支持，因此设置 `'EXTERNAL'='FALSE'` 没有效果。

## 摘要
<a name="synopsis"></a>

```
ALTER TABLE table_name SET TBLPROPERTIES ('property_name' = 'property_value' [ , ... ])
```

## 参数
<a name="parameters"></a>

**SET TBLPROPERTIES ('property\$1name' = 'property\$1value' [ , ... ])**  
将要添加的元数据属性指定为 `property_name`，将每个属性的值指定为 `property value`。如果 `property_name` 已存在，其值将设置为新指定的 `property_value`。  
以下预定义表属性具有特殊用途。    
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/alter-table-set-tblproperties.html)

## 示例
<a name="examples"></a>

以下示例将为表属性添加一条注释。

```
ALTER TABLE orders 
SET TBLPROPERTIES ('notes'="Please don't drop this table.");
```

以下示例将修改表 `existing_table` 以使用 Parquet 文件格式以及 ZSTD 压缩和 ZSTD 压缩级别 4。

```
ALTER TABLE existing_table 
SET TBLPROPERTIES ('parquet.compression' = 'ZSTD', 'compression_level' = 4)
```

# ALTER VIEW DIALECT
<a name="alter-view-dialect"></a>

从 AWS Glue Data Catalog 视图中添加或删除引擎方言。仅适用于 AWS Glue Data Catalog 视图。需要 `Lake Formation` 管理员或定义者权限。

有关 AWS Glue Data Catalog 视图的更多信息，请参阅[在 Athena 中使用 Data Catalog 视图](views-glue.md)。

## 语法
<a name="alter-view-dialect-syntax"></a>

```
ALTER VIEW name [ FORCE ] [ ADD|UPDATE ] DIALECT AS query
```

```
ALTER VIEW name [ DROP ] DIALECT
```

**FORCE**  
`FORCE` 关键字会导致视图中相互冲突的引擎方言信息被新定义覆盖。当 Data Catalog 视图更新导致现有引擎方言中的视图定义相互冲突时，`FORCE` 关键字很有用。假设 Data Catalog 视图同时使用 Athena 和 Amazon Redshift 方言，并且更新导致与视图定义中的 Amazon Redshift 发生冲突。在这种情况下，您可以使用 `FORCE` 关键字来允许更新完成，并将 Amazon Redshift 方言标记为过时。当标记为过时的引擎查询视图时，查询会失败。引擎会抛出异常以禁止过时结果。要更正此问题，请更新视图中的过时方言。

**ADD**  
为 Data Catalog 视图添加新的引擎方言。指定的引擎不得已存在于 Data Catalog 视图中。

**UPDATE**  
更新 Data Catalog 视图中已存在的引擎方言。

**DROP**  
从 Data Catalog 视图中删除现有的引擎方言。从 Data Catalog 视图中删除引擎后，已删除的引擎无法查询 Data Catalog 视图。视图中的其他引擎方言仍然可以查询视图。

**DIALECT AS**  
引入特定于引擎的 SQL 查询。

## 示例
<a name="alter-view-dialect-syntax-examples"></a>

```
ALTER VIEW orders_by_date FORCE ADD DIALECT 
AS 
SELECT orderdate, sum(totalprice) AS price 
FROM orders 
GROUP BY orderdate
```

```
ALTER VIEW orders_by_date FORCE UPDATE DIALECT 
AS 
SELECT orderdate, sum(totalprice) AS price 
FROM orders 
GROUP BY orderdate
```

```
ALTER VIEW orders_by_date DROP DIALECT
```

# CREATE DATABASE
<a name="create-database"></a>

创建一个数据库。`DATABASE` 和 `SCHEMA` 的使用是可互换的。它们具有相同的含义。

**注意**  
有关在 Athena 中创建数据库、创建表和在表上运行 `SELECT` 查询的示例，请参阅 [开始使用](getting-started.md)。

## 摘要
<a name="synopsis"></a>

```
CREATE {DATABASE|SCHEMA} [IF NOT EXISTS] database_name
  [COMMENT 'database_comment']
  [LOCATION 'S3_loc']
  [WITH DBPROPERTIES ('property_name' = 'property_value') [, ...]]
```

有关 Athena 中的数据库名称的限制，请参阅[命名数据库、表和列](tables-databases-columns-names.md)。

## 参数
<a name="parameters"></a>

**[IF NOT EXISTS]**  
如果已存在名为 `database_name` 的数据库，则会导致错误被隐藏。

**[COMMENT database\$1comment]**  
为名为 `comment` 的内置元数据属性以及您为 `database_comment` 提供的值建立元数据值。在 AWS Glue 中，`COMMENT` 内容会写入数据库属性中的 `Description` 字段。

**[LOCATION S3\$1loc]**  
将数据库文件和元存储将要存在的位置指定为 `S3_loc`。该位置必须是 Amazon S3 位置。

**[WITH DBPROPERTIES ('property\$1name' = 'property\$1value') [, ...]]**  
允许您为数据库定义指定自定义元数据属性。

## 示例
<a name="examples"></a>

```
CREATE DATABASE clickstreams;
```

```
CREATE DATABASE IF NOT EXISTS clickstreams
  COMMENT 'Site Foo clickstream data aggregates'
  LOCATION 's3://amzn-s3-demo-bucket/clickstreams/'
  WITH DBPROPERTIES ('creator'='Jane D.', 'Dept.'='Marketing analytics');
```

## 查看数据库属性
<a name="create-database-viewing-properties"></a>

要查看您在 AWSDataCatalog 中使用 `CREATE DATABASE` 创建的数据库的属性，您可以使用 AWS CLI 命令 [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/get-database.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/glue/get-database.html)，如以下示例所示：

```
aws glue get-database --name <your-database-name>
```

在 JSON 中，结果如下所示：

```
{
    "Database": {
        "Name": "<your-database-name>",
        "Description": "<your-database-comment>",
        "LocationUri": "s3://amzn-s3-demo-bucket",
        "Parameters": {
            "<your-database-property-name>": "<your-database-property-value>"
        },
        "CreateTime": 1603383451.0,
        "CreateTableDefaultPermissions": [
            {
                "Principal": {
                    "DataLakePrincipalIdentifier": "IAM_ALLOWED_PRINCIPALS"
                },
                "Permissions": [
                    "ALL"
                ]
            }
        ]
    }
}
```

有关 AWS CLI 的更多信息，请参阅 [AWS Command Line Interface 用户指南](https://docs.aws.amazon.com/cli/latest/userguide/)。

# CREATE TABLE
<a name="create-table"></a>

使用您指定的名称和参数创建表。

**注意**  
此页面包含摘要参考信息。有关在 Athena 中创建表的更多信息和示例 `CREATE TABLE` 语句，请参阅[在 Athena 中创建表](creating-tables.md)。有关在 Athena 中创建数据库、创建表和在表上运行 `SELECT` 查询的示例，请参见 [开始使用](getting-started.md)。

## 摘要
<a name="synopsis"></a>

```
CREATE EXTERNAL TABLE [IF NOT EXISTS]
 [db_name.]table_name [(col_name data_type [COMMENT col_comment] [, ...] )]
 [COMMENT table_comment]
 [PARTITIONED BY (col_name data_type [COMMENT col_comment], ...)]
 [CLUSTERED BY (col_name, col_name, ...) INTO num_buckets BUCKETS]
 [ROW FORMAT row_format]
 [STORED AS file_format] 
 [WITH SERDEPROPERTIES (...)]
 [LOCATION 's3://amzn-s3-demo-bucket/[folder]/']
 [TBLPROPERTIES ( ['has_encrypted_data'='true | false',] ['encryption_option'='SSE_S3 | SSE_KMS | CSE_KMS',] ['kms_key'='aws_kms_key_arn',] ['classification'='aws_glue_classification',] property_name=property_value [, ...] ) ]
```

## 参数
<a name="parameters"></a>

**EXTERNAL**  
指定表基于存储在 Amazon S3 中您所指定的 `LOCATION` 中的底层数据文件。除非是创建 [Iceberg](querying-iceberg-creating-tables.md) 表，否则请始终使用 `EXTERNAL` 关键字。如果您将没有 `EXTERNAL` 关键字的 `CREATE TABLE` 用于非 Iceberg 表，Athena 会发出错误。当您创建外部表时，引用的数据必须符合默认格式或您使用 `ROW FORMAT`、`STORED AS` 和 `WITH SERDEPROPERTIES` 子句指定的格式。

**[IF NOT EXISTS]**  
此参数检查是否已存在名称相同的表。如果是，则参数返回 `TRUE`，然后 Amazon Athena 取消 `CREATE TABLE` 操作。由于取消发生在 Athena 调用数据目录之前，因此不会发出 AWS CloudTrail 事件。

**[db\$1name.]table\$1name**  
指定要创建的表的名称。可选的 `db_name` 参数指定表所在的数据库。如果省略，则会采用当前数据库。如果表名称包含数字，请用引号将 `table_name` 引起来，例如 `"table123"`。如果 `table_name` 以下划线开头，请使用反引号，例如 ``_mytable``。不支持特殊字符 (下划线除外)。  
Athena 表名称不区分大小写；但是，如果您使用 Apache Spark，则 Spark 需要小写表名称。有关 Athena 中的表名称的限制，请参阅[命名数据库、表和列](tables-databases-columns-names.md)。

**[ ( col\$1name data\$1type [COMMENT col\$1comment] [, ...] ) ]**  
为要创建的每个列指定名称，以及列的数据类型。列名称不允许下划线 `(_)` 以外的特殊字符。如果 `col_name` 以下划线开头，请将列名称放入反引号内，例如 ``_mycolumn``。有关 Athena 中的列名称的限制，请参阅[命名数据库、表和列](tables-databases-columns-names.md)。  
`data_type` 值可能为以下任一值：  
+ `boolean` – 值为 `true` 和 `false`。
+ `tinyint` – 一个 8 位有符号的整数，采用二进制补码格式，最小值为 -2^7，最大值为 2^7-1。
+ `smallint` – 一个 16 位有符号的整数，采用二进制补码格式，最小值为 -2^15，最大值为 2^15-1。
+ `int` – 在数据定义语言 (DDL) 查询（如 `CREATE TABLE`）中，使用 `int` 关键字来表示整数。在其他查询中，使用关键字 `integer`，其中 `integer` 以二进制补码格式表示为 32 位有符号值，最小值为 -2^31，最大值为 2^31-1。在 JDBC 驱动程序中，将返回 `integer` 以确保与业务分析应用程序兼容。
+ `bigint` – 一个 64 位有符号的整数，采用二进制补码格式，最小值为 -2^63，最大值为 2^63-1。
+ `double` – 64 位有符号的双精度浮点数。范围为 4.94065645841246544e-324d 至 1.79769313486231570e\$1308d，正或负。`double` 遵循 IEEE 浮点算法标准 (IEEE 754)。
+ `float` – 32 位有符号的单精度浮点数。范围为 1.40129846432481707e-45 至 3.40282346638528860e\$138，正或负。`float` 遵循 IEEE 浮点算法标准 (IEEE 754)。相当于 Presto 中的 `real`。在 Athena 中，在 `CREATE TABLE` 等 DDL 语句中使用 `float`，在 `SELECT CAST` 等 SQL 函数中使用 `real`。AWS Glue 爬网程序以 `float` 返回值, Athena 将内部翻译 `real` 和 `float` 类型（请参阅 [2018 年 6 月 5 日](release-notes.md#release-note-2018-06-05) 发布说明）。
+ `decimal [ (precision, scale) ]`，其中 `precision` 是总位数，而 `scale`（可选）是小数部分的位数，默认值为 0。例如，使用以下类型定义：`decimal(11,5)`、`decimal(15)`。最大*精度*值为 38，最大*标度*值为 38。

  要将十进制值指定为文字（例如在查询 DDL 表达式中选择具有特定十进制值的行时），请指定 `decimal` 类型定义，并在查询中将十进制值列为文字（带单引号），如下例所示：`decimal_value = decimal '0.12'`。
+ `char` – 固定长度字符数据，具有介于 1 和 255 之间的指定长度，例如 `char(10)`。有关更多信息，请参阅 [CHAR Hive 数据类型](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-char)。
+ `varchar` – 可变长度字符数据，具有介于 1 和 65535 之间的指定长度，例如 `varchar(10)`。有关更多信息，请参阅 [VARCHAR Hive 数据类型](https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Types#LanguageManualTypes-varchar)。
+ `string` – 用单引号或双引号括起的字符串文本。
**注意**  
在 Athena 中，无法将非字符串数据类型强制转换为 `string`；而是将这些数据类型强制转换为 `varchar`。
+ `binary` –（适用于 Parquet 中的数据）
+ `date` – ISO 格式的日期，例如 `YYYY-MM-DD`。例如 `date '2008-09-15'`。OpenCSVSerDe 是一个例外，它使用自 1970 年 1 月 1 日以来经过的天数。有关更多信息，请参阅 [用于处理 CSV 的 Open CSV SerDe](csv-serde.md)。
+ `timestamp` – 使用 [https://docs.oracle.com/javase/8/docs/api/java/sql/Timestamp.html](https://docs.oracle.com/javase/8/docs/api/java/sql/Timestamp.html) 兼容格式的瞬间日期和时间最多可达毫秒级的最大分辨率，例如 `yyyy-MM-dd HH:mm:ss[.f...]`。例如 `timestamp '2008-09-15 03:04:05.324'`。OpenCSVSerDe 是一个例外，它使用UNIX 数字格式的 `TIMESTAMP` 数据（例如 `1579059880000`）。有关更多信息，请参阅 [用于处理 CSV 的 Open CSV SerDe](csv-serde.md)。
+ `array` < data\$1type >
+ `map` < primitive\$1type, data\$1type >
+ `struct`< col\$1name : data\$1type [comment col\$1comment] [, ...]>

**[COMMENT table\$1comment]**  
创建 `comment` 表属性并用您指定的 `table_comment` 填充它。

**[PARTITIONED BY (col\$1name data\$1type [ COMMENT col\$1comment ], ... ) ]**  
使用指定了 `col_name`、`data_type` 和 `col_comment` 的一个或多个分区列创建分区表。一个表可以有一个或多个分区，这些分区由多个不同的列名称和值组合组成。将会为每个指定的组合创建一个单独的数据目录，这在某些情况下可提高查询性能。已分区列在表数据本身中不存在。如果您将与表列相同的某个值用于 `col_name`，则会产生错误。有关更多信息，请参阅[分区数据](partitions.md)。  
在您创建具有分区的表后，请运行后续查询，其中包含 [MSCK REPAIR TABLE](msck-repair-table.md) 子句用以刷新分区元数据，例如，`MSCK REPAIR TABLE cloudfront_logs;`。对于不兼容 Hive 的分区，请使用 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md) 加载分区，以便您可以查询数据。

**[CLUSTERED BY (col\$1name, col\$1name, ...) INTO num\$1buckets BUCKETS]**  
在使用分区或不使用分区的情况下，将指定 `col_name` 列中的数据分成名为*存储桶*的数据子集。`num_buckets` 参数指定要创建的存储桶数量。分桶可以提高对大型数据集的某些查询的性能。

**[ROW FORMAT row\$1format]**  
指定表及其底层源数据 (如果适用) 的行格式。对于 `row_format`，您可以使用 `DELIMITED` 子句指定一个或多个分隔符，或者如下所述使用 `SERDE` 子句。如果省略 `ROW FORMAT` 或指定 `ROW FORMAT DELIMITED`，则会使用本机 SerDe。  
+ [DELIMITED FIELDS TERMINATED BY char [ESCAPED BY char]]
+ [DELIMITED COLLECTION ITEMS TERMINATED BY char]
+ [MAP KEYS TERMINATED BY char]
+ [LINES TERMINATED BY char]
+ [NULL DEFINED AS char]

  仅当使用 Hive 0.13 且 STORED AS 文件格式为 `TEXTFILE` 时才可用。
 **或者**   
+ SERDE 'serde\$1name' [WITH SERDEPROPERTIES ("property\$1name" = "property\$1value", "property\$1name" = "property\$1value" [, ...] )]

  `serde_name` 指示要使用的 SerDe。`WITH SERDEPROPERTIES` 子句能让您提供 SerDe 允许的一个或多个自定义属性。

**[STORED AS file\$1format]**  
为表数据指定文件格式。如果省略，则 `TEXTFILE` 是默认值。`file_format` 的选项是：  
+ SEQUENCEFILE
+ TEXTFILE
+ RCFILE
+ ORC
+ PARQUET
+ AVRO
+ ION
+ INPUTFORMAT input\$1format\$1classname OUTPUTFORMAT output\$1format\$1classname

**[LOCATION 's3://amzn-s3-demo-bucket/[folder]/']**  
指定从中创建表的底层数据在 Amazon S3 中的位置。位置路径必须是存储桶名称或存储桶名称以及一个或多个文件夹。如果您使用分区，请指定分区数据的根目录。有关表位置的更多信息，请参阅[指定 Amazon S3 中的表位置](tables-location-format.md)。有关数据格式和权限的信息，请参阅 [Amazon S3 注意事项](creating-tables.md#s3-considerations)。  
为您的文件夹或存储桶使用尾部斜杠。请勿使用文件名或 glob 字符。  
 **使用**:  
`s3://amzn-s3-demo-bucket/`  
`s3://amzn-s3-demo-bucket/folder/`  
`s3://amzn-s3-demo-bucket/folder/anotherfolder/`  
 **请勿使用：**  
`s3://amzn-s3-demo-bucket`  
`s3://amzn-s3-demo-bucket/*`  
`s3://amzn-s3-demo-bucket/mydatafile.dat`

**[TBLPROPERTIES ( ['has\$1encrypted\$1data'='true \$1 false',] ['encryption\$1option'='SSE\$1S3 \$1 SSE\$1KMS \$1 CSE\$1KMS',] ['kms\$1key'='aws\$1kms\$1key\$1arn',] ['classification'='classification\$1value',] property\$1name=property\$1value [, ...] ) ]**  
除预定义的表属性外，还指定表定义的自定义元数据键-值对，例如 `"comment"`。  
**has\$1encrypted\$1data** – Athena 有一个内置属性 `has_encrypted_data`。将此属性设置为 `true` 以指示 `LOCATION` 指定的底层数据集是 CSE-KMS 加密的。如果省略，并且如果工作组的设置不覆盖客户端设置，则假设 `false`。如果加密了底层数据时将它省略或设置为 `false`，则查询会导致错误。有关更多信息，请参阅 [静态加密](encryption.md)。  
**encryption\$1option**：将此属性设置为 `SSE_S3`、`SSE_KMS` 或 `CSE_KMS`，以表示由 `LOCATION` 指定的底层数据集中使用的最高加密级别。有关更多信息，请参阅 [静态加密](encryption.md)。  
**kms\$1key**：将此属性设置为用于加密和解密表数据文件的 AWS KMS 密钥 ARN。使用 `SSE_KMS` 或 `CSE_KMS` 加密写入时，Athena 使用此密钥加密表数据文件，以及解密 CSE-KMS 加密的表数据文件。仅当 `encryption_option` 设置为 `SSE_KMS` 或 `CSE_KMS` 时需要此属性。有关更多信息，请参阅 [静态加密](encryption.md)。  
**classification** – 在 CloudTrail 控制台中为 Athena 创建的表将 `cloudtrail` 添加为 `classification` 属性的值。为运行 ETL 任务，AWS Glue 要求您创建一个具有 `classification` 属性的表来将 AWS Glue 的数据类型指示为 `csv`、`parquet`、`orc`、`avro` 或 `json`。例如 `'classification'='csv'`。如果您不指定此属性，则 ETL 任务将会失败。随后，您可以使用 AWS Glue 控制台、API 或 CLI 来指定它。有关更多信息，请参阅 [为 ETL 作业创建表](schema-classifier.md)和《AWS Glue 开发人员指南》**中的[在 AWS Glue 中编写任务](https://docs.aws.amazon.com/glue/latest/dg/author-job.html)。  
**compression\$1level** – `compression_level` 属性指定了要使用的压缩级别。此属性仅适用于 ZSTD 压缩。可能的值介于 1 和 22 之间。默认值为 3。有关更多信息，请参阅 [使用 ZSTD 压缩级别](compression-support-zstd-levels.md)。  
有关其他表属性的更多信息，请参阅 [ALTER TABLE SET TBLPROPERTIES](alter-table-set-tblproperties.md)。

## 示例
<a name="create-table-examples"></a>

以下示例 `CREATE TABLE` 语句会基于存储在 Amazon S3 中的制表符分隔的行星数据创建一个表。

```
CREATE EXTERNAL TABLE planet_data (
  planet_name string,
  order_from_sun int,
  au_to_sun float,
  mass float,
  gravity_earth float,
  orbit_years float,
  day_length float
  )
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS TEXTFILE
LOCATION 's3://amzn-s3-demo-bucket/tsv/'
```

请注意以下几点：
+ `ROW FORMAT DELIMITED` 子句指示数据由特定字符分隔。
+ `FIELDS TERMINATED BY '\t'` 子句指定 TSV 数据中的字段由制表符 ('\$1t') 分隔。
+ `STORED AS TEXTFILE` 子句指示数据以纯文本文件的形式存储在 Amazon S3 中。

要查询数据，可以使用如下所示的简单 `SELECT` 语句：

```
SELECT * FROM planet_data
```

要使用该示例在 Athena 中创建您自己的 TSV 表，请将表和列名替换为您自己的表和列的名称和数据类型，并更新 `LOCATION` 子句以指向存储 TSV 文件的 Amazon S3 路径。

有关创建表的更多信息，请参阅 [在 Athena 中创建表](creating-tables.md)。

# CREATE TABLE AS
<a name="create-table-as"></a>

创建新表，使用 [SELECT](select.md) 查询的结果填充该表。要创建空表，使用 [CREATE TABLE](create-table.md)。`CREATE TABLE AS` 将 `CREATE TABLE` DDL 语句与 `SELECT` DML 语句结合在一起，因此严格地说同时包含 DDL 和 DML。请注意，尽管 `CREATE TABLE AS` 在这里与其他 DDL 语句分组在一起，但出于服务限额目的，Athena 中的 CTAS 查询仍被视为 DML。有关 Athena 服务限额的信息，请参阅 [服务配额](service-limits.md)。

**注意**  
对于 CTAS 语句，预期存储桶拥有者设置不适用于 Amazon S3 中的目标表位置。预期存储桶拥有者设置仅适用于您为 Athena 查询结果指定的 Amazon S3 输出位置。有关更多信息，请参阅 [使用 Athena 控制台指定查询结果位置](query-results-specify-location-console.md)。

有关超出此参考主题范围的 `CREATE TABLE AS` 其他信息，请参阅 [从查询结果创建表（CTAS）](ctas.md)。

**Topics**
+ [摘要](#synopsis)
+ [CTAS 表属性](#ctas-table-properties)
+ [示例](#ctas-table-examples)

## 摘要
<a name="synopsis"></a>

```
CREATE TABLE table_name
[ WITH ( property_name = expression [, ...] ) ]
AS query
[ WITH [ NO ] DATA ]
```

其中：

**WITH ( property\$1name = expression [, ...] )**  
可选 CTAS 表属性的列表，其中一些属性特定于数据存储格式。请参阅 [CTAS 表属性](#ctas-table-properties)。

**查询**  
用于创建新表的 [SELECT](select.md) 查询。  
如果您计划创建包含分区的查询，请指定 `SELECT` 语句的列列表中最后一个分区列的名称。

**[ WITH [ NO ] DATA ]**  
如果使用 `WITH NO DATA`，则将创建与原始表具有相同架构的新空表。

**注意**  
若要在查询结果输出中包含列标题，可以使用简单的 `SELECT` 查询而不是 CTAS 查询。您可以从查询结果位置检索结果，也可以使用 Athena 控制台直接下载结果。有关更多信息，请参阅 [使用查询结果和最近查询](querying.md)。

## CTAS 表属性
<a name="ctas-table-properties"></a>

Athena 中的每个 CTAS 表具有可选的 CTAS 表属性列表，您可以使用 `WITH (property_name = expression [, ...] )` 指定。有关使用这些参数的信息，请参阅 [CTAS 查询的示例](ctas-examples.md)。

** `WITH (property_name = expression [, ...], )` **    
 `table_type = ['HIVE', 'ICEBERG']`   
可选。默认为 `HIVE`。指定结果表的表类型  
例如：  

```
WITH (table_type ='ICEBERG')
```  
 `external_location = [location]`   
由于 Iceberg 表不是外部表，因此该属性不适用于 Iceberg 表。要在 CTAS 语句中定义 Iceberg 表的根位置，请使用本节后面所述的 `location` 属性。
可选。Athena 在 Amazon S3 中保存 CTAS 查询的位置。  
例如：  

```
 WITH (external_location ='s3://amzn-s3-demo-bucket/tables/parquet_table/')
```
Athena 不会对查询结果使用同一路径两次。如果您手动指定了位置，请确保您指定的 Amazon S3 位置没有任何数据。Athena 从不尝试删除数据。如果您要再次使用相同的位置，请手动删除数据，否则 CTAS 查询将失败。  
如果您运行一个 CTAS 查询，且该查询在[强制执行查询结果位置](workgroups-settings-override.md)的工作组中指定 `external_location`，则查询会失败并出现错误消息。要查看为工作组指定的查询结果位置， [请参阅工作组的详细信息](viewing-details-workgroups.md)。  
如果您的工作组覆盖查询结果位置的客户端设置，则 Athena 会在以下位置创建表：  

```
s3://amzn-s3-demo-bucket/tables/query-id/
```
如果您未使用 `external_location` 属性指定位置，并且工作组未覆盖客户端设置，则 Athena 将使用查询结果位置的[客户端设置](query-results-specify-location-console.md)在以下位置创建表：  

```
s3://amzn-s3-demo-bucket/Unsaved-or-query-name/year/month/date/tables/query-id/
```  
 `is_external = [boolean]`   
可选。表示此表是否为外部表。默认值为 true。对于 Iceberg 表，必须将其设置为 false。  
例如：  

```
WITH (is_external = false)
```  
 `location = [location]`   
对于 Iceberg 表是必需的。指定要根据查询结果创建的 Iceberg 表的根位置。  
例如：  

```
WITH (location ='s3://amzn-s3-demo-bucket/tables/iceberg_table/')
```  
 `field_delimiter = [delimiter]`   
（可选）特定于基于文本的数据存储格式。CSV、TSV 和文本文件中文件的单字符字段分隔符。例如，`WITH (field_delimiter = ',')`。目前，CTAS 查询不支持多字符字段分隔符。如果您未指定字段分隔符，则默认使用 `\001`。  
 `format = [storage_format]`   
CTAS 查询结果的存储格式，例如 `ORC`、`PARQUET`、`AVRO`、`JSON`、`ION` 或 `TEXTFILE`。对于 Iceberg 表，允许使用 `ORC`、`PARQUET` 和 `AVRO` 格式。如果忽略，则默认使用 `PARQUET`。此参数的名称 `format` 必须以小写列出，否则 CTAS 查询将失败。  
例如：  

```
WITH (format = 'PARQUET')
```  
 `bucketed_by = ARRAY[ column_name[,…], bucket_count = [int] ]`   
该属性不适用于 Iceberg 表。对于 Iceberg 表，使用带存储桶转换的分区。
用于分桶存储数据的存储桶数组列表。如果省略，则 Athena 在此查询中不会分桶存储数据。  
 `bucket_count = [int]`   
该属性不适用于 Iceberg 表。对于 Iceberg 表，使用带存储桶转换的分区。
用于分桶存储数据的存储桶编号。如果省略，Athena 不分桶存储数据。例如：  

```
CREATE TABLE bucketed_table WITH (
  bucketed_by = ARRAY[column_name], 
  bucket_count = 30, format = 'PARQUET', 
  external_location ='s3://amzn-s3-demo-bucket/tables/parquet_table/'
) AS 
SELECT 
  * 
FROM 
  table_name
```  
 `partitioned_by = ARRAY[ col_name[,…] ]`   
该属性不适用于 Iceberg 表。要将分区转换用于 Iceberg 表，请使用本节后面所述的 `partitioning` 属性。
可选。CTAS 表进行分区所依据的列的数组列表。确认分区列的名称在 `SELECT` 语句的列列表中最后列出。  
 `partitioning = ARRAY[partition_transform, ...]`   
可选。指定要创建的 Iceberg 表的分区。Iceberg 支持多种分区转换和分区演化。下表总结了分区转换。    
****    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/create-table-as.html)
例如：  

```
 WITH (partitioning = ARRAY['month(order_date)', 
                            'bucket(account_number, 10)', 
                            'country']))
```  
 `optimize_rewrite_min_data_file_size_bytes = [long]`   
可选。数据优化的特定配置。包含小于指定值的文件以进行优化。默认值为 `write_target_data_file_size_bytes` 的 0.75 倍。该属性仅适用于 Iceberg 表。有关更多信息，请参阅 [优化 Iceberg 表](querying-iceberg-data-optimization.md)。  
例如：  

```
WITH (optimize_rewrite_min_data_file_size_bytes = 402653184)
```  
 `optimize_rewrite_max_data_file_size_bytes = [long]`   
可选。数据优化的特定配置。包含大于指定值的文件以进行优化。默认值为 `write_target_data_file_size_bytes` 的 1.8 倍。该属性仅适用于 Iceberg 表。有关更多信息，请参阅 [优化 Iceberg 表](querying-iceberg-data-optimization.md)。  
例如：  

```
WITH (optimize_rewrite_max_data_file_size_bytes = 966367641)
```  
 `optimize_rewrite_data_file_threshold = [int]`   
可选。数据优化的特定配置。若需要优化的数据文件少于给定阈值，则不会重写这些文件。这将允许积累更多的数据文件以生成更接近目标大小的文件，并跳过不必要的计算以节省成本。默认值为 5。该属性仅适用于 Iceberg 表。有关更多信息，请参阅 [优化 Iceberg 表](querying-iceberg-data-optimization.md)。  
例如：  

```
WITH (optimize_rewrite_data_file_threshold = 5)
```  
 `optimize_rewrite_delete_file_threshold = [int]`   
可选。数据优化的特定配置。如果与数据文件关联的删除文件少于阈值，则不会重写该数据文件。这将允许为每个数据文件累积更多的删除文件，以节省成本。默认值为 2。该属性仅适用于 Iceberg 表。有关更多信息，请参阅 [优化 Iceberg 表](querying-iceberg-data-optimization.md)。  
例如：  

```
WITH (optimize_rewrite_delete_file_threshold = 2)
```  
 `vacuum_min_snapshots_to_keep = [int]`   
可选。对特定配置执行 vacuum 操作。要保留的最新快照的最小数量。默认 为 1。该属性仅适用于 Iceberg 表。有关更多信息，请参阅 [VACUUM](vacuum-statement.md)。  
`vacuum_min_snapshots_to_keep` 属性需要 Athena 引擎版本 3。
例如：  

```
WITH (vacuum_min_snapshots_to_keep = 1)
```  
 `vacuum_max_snapshot_age_seconds = [long]`   
可选。对特定配置执行 vacuum 操作。以秒为单位的时间段，表示要保留的快照期限。默认值为 432000（5 天）。该属性仅适用于 Iceberg 表。有关更多信息，请参阅 [VACUUM](vacuum-statement.md)。  
`vacuum_max_snapshot_age_seconds` 属性需要 Athena 引擎版本 3。
例如：  

```
WITH (vacuum_max_snapshot_age_seconds = 432000)
```  
 `write_compression = [compression_format]`   
用于允许指定压缩的任何存储格式的压缩类型。`compression_format` 值指定将数据写入表时要使用的压缩。您可以为 `TEXTFILE`、`JSON`、`PARQUET` 和 `ORC` 文件格式指定压缩。  
例如，如果 `format` 属性指定 `PARQUET` 作为存储格式，则 `write_compression` 的值指定 Parquet 的压缩格式。在这种情况下，为 `write_compression` 指定一个值等同于为 `parquet_compression` 指定一个值。  
同样，如果 `format` 属性指定 `ORC` 作为存储格式，则 `write_compression` 的值指定 ORC 的压缩格式。在这种情况下，为 `write_compression` 指定一个值等同于为 `orc_compression` 指定一个值。  
不能在同一 CTAS 查询中指定多个压缩格式表属性。例如，您无法在同一个查询中同时指定 `write_compression` 和 `parquet_compression`。这同样适用于 `write_compression` 和 `orc_compression`。有关每种文件格式支持的压缩类型的信息，请参阅 [在 Athena 中使用压缩](compression-formats.md)。  
 `orc_compression = [compression_format]`   
将 `ORC` 数据写入表时用于 `ORC` 文件格式的压缩类型。例如，`WITH (orc_compression = 'ZLIB')`。`ORC` 文件内的数据块（`ORC` Postscript 除外）使用您指定的压缩进行压缩。如果省略，则默认情况下对 `ORC` 使用 ZLIB 压缩。  
为保持一致性，我们建议您使用 `write_compression` 属性而不是 `orc_compression`。使用 `format` 属性将存储格式指定为 `ORC`，然后使用 `write_compression` 属性指定 `ORC` 将使用的压缩格式。  
 `parquet_compression = [compression_format]`   
将 Parquet 数据写入表时用于 Parquet 文件格式的压缩类型。例如，`WITH (parquet_compression = 'SNAPPY')`。此压缩应用于 Parquet 文件中的列块。如果省略，则默认情况下对 Parquet 使用 GZIP 压缩。  
为保持一致性，我们建议您使用 `write_compression` 属性而不是 `parquet_compression`。使用 `format` 属性将存储格式指定为 `PARQUET`，然后使用 `write_compression` 属性指定 `PARQUET` 将使用的压缩格式。  
 `compression_level = [compression_level]`   
要使用的压缩级别。此属性仅适用于 ZSTD 压缩。可能的值介于 1 和 22 之间。默认值为 3。有关更多信息，请参阅 [使用 ZSTD 压缩级别](compression-support-zstd-levels.md)。

## 示例
<a name="ctas-table-examples"></a>

有关 CTAS 查询的示例，请参阅以下资源。
+  [CTAS 查询的示例](ctas-examples.md) 
+  [将 CTAS 和 INSERT INTO 用于 ETL 和数据分析](ctas-insert-into-etl.md) 
+  [将 CTAS 语句与 Amazon Athena 结合使用以降低成本并提高性能](https://aws.amazon.com/blogs/big-data/using-ctas-statements-with-amazon-athena-to-reduce-cost-and-improve-performance/) 
+  [使用 CTAS 和 INSERT INTO 绕过 100 分区限制](ctas-insert-into.md) 

# CREATE VIEW 和 CREATE PROTECTED MULTI DIALECT VIEW
<a name="create-view"></a>

视图是一个逻辑表，可以被未来查询所引用。视图不包含任何数据，也不写入数据。相反，当您每次通过另一个查询引用该视图时，该视图指定的查询都会运行。
+ `CREATE VIEW` 从指定的 `SELECT` 查询创建 Athena 视图。Athena 视图在 Athena 中起作用。有关 Athena 视图的更多信息，请参阅[使用视图](views.md)。
+ `CREATE PROTECTED MULTI DIALECT VIEW` 在 AWS Glue Data Catalog 中创建 AWS Glue Data Catalog 视图。AWS Glue Data Catalog 视图跨 AWS 服务（例如 Amazon Athena 和 Amazon Redshift）提供单一通用视图。有关 AWS Glue Data Catalog 视图的更多信息，请参阅[在 Athena 中使用 Data Catalog 视图](views-glue.md)。

## CREATE VIEW
<a name="create-view-ate"></a>

创建在 Athena 中使用的视图。

### 摘要
<a name="synopsis"></a>

```
CREATE [ OR REPLACE ] VIEW view_name AS query
```

可选的 `OR REPLACE` 子句允许您通过替换来更新现有视图。有关更多信息，请参阅 [创建视图](views-console.md#creating-views)。

### 示例
<a name="examples"></a>

要根据表 `orders` 创建视图 `test`，请使用类似如下的查询：

```
CREATE VIEW test AS
SELECT 
orderkey, 
orderstatus, 
totalprice / 2 AS half
FROM orders;
```

要根据表 `orders` 创建视图 `orders_by_date`，请使用以下查询：

```
CREATE VIEW orders_by_date AS
SELECT orderdate, sum(totalprice) AS price
FROM orders
GROUP BY orderdate;
```

要更新现有视图，请使用类似于以下内容的示例：

```
CREATE OR REPLACE VIEW test AS
SELECT orderkey, orderstatus, totalprice / 4 AS quarter
FROM orders;
```

 有关使用 Athena 视图的更多信息，请参阅[使用视图](views.md)。

## CREATE PROTECTED MULTI DIALECT VIEW
<a name="create-protected-multi-dialect-view"></a>

在 AWS Glue Data Catalog 中创建 AWS Glue Data Catalog 视图。Data Catalog 视图是一种单一视图架构，可以在 Athena 和其他 SQL 引擎（例如 Amazon Redshift 和 Amazon EMR）之间运行。

### 语法
<a name="create-protected-multi-dialect-view-syntax"></a>

```
CREATE [ OR REPLACE ] PROTECTED MULTI DIALECT VIEW view_name 
SECURITY DEFINER 
[ SHOW VIEW JSON ]
AS query
```

**OR REPLACE**  
（可选）通过替换现有视图来更新它。如果 Data Catalog 视图中存在其他引擎的 SQL 方言，则无法替换该视图。如果调用引擎拥有视图中唯一的 SQL 方言，则可以替换视图。

**PROTECTED**  
所需关键字。指定视图受到保护以防数据泄露。Data Catalog 视图只能作为 `PROTECTED` 视图创建。

**MULTI DIALECT**  
指定视图支持不同查询引擎的 SQL 方言，因此可以由这些引擎读取。

**SECURITY DEFINER**  
指定定义程序语义适用于此视图。定义程序语义意味着基础表的有效读取权限属于定义视图的主体或角色，而不是执行实际读取的主体。

**SHOW VIEW JSON**  
（可选）返回 Data Catalog 视图规范的 JSON，而不实际创建视图。当您要验证视图的 SQL 并返回 AWS Glue 将要使用的表元数据时，此“空运行”选项非常有用。

### 示例
<a name="create-protected-multi-dialect-view-syntax-example"></a>

以下示例基于 `orders` 表查询创建 `orders_by_date` Data Catalog 视图。

```
CREATE PROTECTED MULTI DIALECT VIEW orders_by_date 
SECURITY DEFINER 
AS 
SELECT orderdate, sum(totalprice) AS price 
FROM orders 
WHERE order_city = 'SEATTLE' 
GROUP BY orderdate
```

有关使用 AWS Glue Data Catalog 视图的更多信息，请参阅[在 Athena 中使用 Data Catalog 视图](views-glue.md)。

# DESCRIBE
<a name="describe-table"></a>

为指定表显示一个或多个列，包括分区列。此命令对于检查复杂列的属性非常有用。

## 摘要
<a name="synopsis"></a>

```
DESCRIBE [EXTENDED | FORMATTED] [db_name.]table_name [PARTITION partition_spec] [col_name ( [.field_name] | [.'$elem$'] | [.'$key$'] | [.'$value$'] )]
```

**重要**  
此语句的语法为 `DESCRIBE table_name` 而非 `DESCRIBE TABLE table_name`。使用后一种语法会导致出现错误消息 FAILED: SemanticException [Error 10001]: Table not found table（失败：SemanticException [错误 10001]：找不到表）。

## 参数
<a name="parameters"></a>

**[EXTENDED \$1 FORMATTED]**  
确定输出的格式。省略这些参数会以表格格式显示列名称及其对应的数据类型，包括分区列。指定 `FORMATTED` 不仅会以表格格式显示列名和数据类型，还会显示详细的表格和存储信息。`EXTENDED` 会以表格格式显示列和数据类型信息，并以 Thrift 序列化形式显示表的详细元数据。此格式的可读性较差，因而主要用于调试。

**[PARTITION partition\$1spec]**  
如果包括在内，则列出由 `partition_spec` 指定的分区的元数据，其中 `partition_spec` 的格式为 `(partition_column = partition_col_value, partition_column = partition_col_value, ...)`。

**[col\$1name ( [.field\$1name] \$1 [.'\$1elem\$1'] \$1 [.'\$1key\$1'] \$1 [.'\$1value\$1'] )\$1 ]**  
指定要检查的列和属性。您可以为结构的元素指定 `.field_name`，为数组元素指定 `'$elem$'`，为映射键指定 `'$key$'`，为映射值指定 `'$value$'`。您可以以递归方式指定它，以便进一步探索复杂的列。

### 示例
<a name="examples"></a>

```
DESCRIBE orders
```

```
DESCRIBE FORMATTED mydatabase.mytable PARTITION (part_col = 100) columnA;
```

下面的查询和输出显示了来自 `impressions` 表的列和数据类型信息，该表基于 Amazon EMR 示例数据。

```
DESCRIBE impressions
```

```
requestbegintime          string                                         from deserializer   
adid                      string                                         from deserializer   
impressionid              string                                         from deserializer   
referrer                  string                                         from deserializer   
useragent                 string                                         from deserializer   
usercookie                string                                         from deserializer   
ip                        string                                         from deserializer   
number                    string                                         from deserializer   
processid                 string                                         from deserializer   
browsercokie              string                                         from deserializer   
requestendtime            string                                         from deserializer   
timers                    struct<modellookup:string,requesttime:string>  from deserializer   
threadid                  string                                         from deserializer   
hostname                  string                                         from deserializer   
sessionid                 string                                         from deserializer   
dt                        string

# Partition Information
# col_name                data_type                 comment             

dt                        string
```

下面的示例查询和输出显示了使用 `FORMATTED` 选项时相同表的结果。

```
DESCRIBE FORMATTED impressions
```

```
requestbegintime          string                                         from deserializer
adid                      string                                         from deserializer
impressionid              string                                         from deserializer
referrer                  string                                         from deserializer
useragent                 string                                         from deserializer
usercookie                string                                         from deserializer
ip                        string                                         from deserializer
number                    string                                         from deserializer
processid                 string                                         from deserializer
browsercokie              string                                         from deserializer
requestendtime            string                                         from deserializer
timers                    struct<modellookup:string,requesttime:string>  from deserializer
threadid                  string                                         from deserializer
hostname                  string                                         from deserializer
sessionid                 string                                         from deserializer
dt                        string

# Partition Information
# col_name                data_type                 comment

dt                        string

# Detailed Table Information
Database:                 sampledb
Owner:                    hadoop
CreateTime:               Thu Apr 23 02:55:21 UTC 2020
LastAccessTime:           UNKNOWN
Protect Mode:             None
Retention:                0
Location:                 s3://us-east-1.elasticmapreduce/samples/hive-ads/tables/impressions
Table Type:               EXTERNAL_TABLE
Table Parameters:
        EXTERNAL                  TRUE
        transient_lastDdlTime     1587610521

# Storage Information
SerDe Library:                         org.openx.data.jsonserde.JsonSerDe
InputFormat:                           org.apache.hadoop.mapred.TextInputFormat
OutputFormat:                          org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat
Compressed:                            No
Num Buckets:                           -1
Bucket Columns:                        []
Sort Columns:                          []
Storage Desc Params:
        paths                                  requestbegintime, adid, impressionid, referrer, useragent, usercookie, ip
        serialization.format                   1
```

下面的示例查询和输出显示了使用 `EXTENDED` 选项时相同表的结果。表的详细信息会输出到一行中，但是为了便于阅读，此处设置了格式。

```
DESCRIBE EXTENDED impressions
```

```
requestbegintime          string                                         from deserializer
adid                      string                                         from deserializer
impressionid              string                                         from deserializer
referrer                  string                                         from deserializer
useragent                 string                                         from deserializer
usercookie                string                                         from deserializer
ip                        string                                         from deserializer
number                    string                                         from deserializer
processid                 string                                         from deserializer
browsercokie              string                                         from deserializer
requestendtime            string                                         from deserializer
timers                    struct<modellookup:string,requesttime:string>  from deserializer
threadid                  string                                         from deserializer
hostname                  string                                         from deserializer
sessionid                 string                                         from deserializer
dt                        string

# Partition Information
# col_name                data_type                 comment

dt                        string

Detailed Table Information       Table(tableName:impressions, dbName:sampledb, owner:hadoop, createTime:1587610521, 
lastAccessTime:0, retention:0, sd:StorageDescriptor(cols:[FieldSchema(name:requestbegintime, type:string, comment:null), 
FieldSchema(name:adid, type:string, comment:null), FieldSchema(name:impressionid, type:string, comment:null), 
FieldSchema(name:referrer, type:string, comment:null), FieldSchema(name:useragent, type:string, comment:null), 
FieldSchema(name:usercookie, type:string, comment:null), FieldSchema(name:ip, type:string, comment:null), 
FieldSchema(name:number, type:string, comment:null), FieldSchema(name:processid, type:string, comment:null), 
FieldSchema(name:browsercokie, type:string, comment:null), FieldSchema(name:requestendtime, type:string, comment:null), 
FieldSchema(name:timers, type:struct<modellookup:string,requesttime:string>, comment:null), FieldSchema(name:threadid, 
type:string, comment:null), FieldSchema(name:hostname, type:string, comment:null), FieldSchema(name:sessionid, 
type:string, comment:null)], location:s3://us-east-1.elasticmapreduce/samples/hive-ads/tables/impressions, 
inputFormat:org.apache.hadoop.mapred.TextInputFormat, 
outputFormat:org.apache.hadoop.hive.ql.io.IgnoreKeyTextOutputFormat, compressed:false, numBuckets:-1, 
serdeInfo:SerDeInfo(name:null, serializationLib:org.openx.data.jsonserde.JsonSerDe, parameters:{serialization.format=1, 
paths=requestbegintime, adid, impressionid, referrer, useragent, usercookie, ip}), bucketCols:[], sortCols:[], parameters:{}, 
skewedInfo:SkewedInfo(skewedColNames:[], skewedColValues:[], skewedColValueLocationMaps:{}), 
storedAsSubDirectories:false), partitionKeys:[FieldSchema(name:dt, type:string, comment:null)], 
parameters:{EXTERNAL=TRUE, transient_lastDdlTime=1587610521}, viewOriginalText:null, viewExpandedText:null, 
tableType:EXTERNAL_TABLE)
```

# DESCRIBE VIEW
<a name="describe-view"></a>

显示指定 Athena 或 AWS Glue Data Catalog 视图的列的列表。对于检查复杂视图的属性有帮助。

 对于 Data Catalog 视图，此语句的输出由 Lake Formation 访问控制进行控制，并且仅显示调用者有权访问的列。

## 摘要
<a name="synopsis"></a>

```
DESCRIBE [db_name.]view_name
```

## 示例
<a name="examples"></a>

```
DESCRIBE orders
```

另请参阅 [SHOW COLUMNS](show-columns.md)、[SHOW CREATE VIEW](show-create-view.md)、[SHOW VIEWS](show-views.md) 和 [DROP VIEW](drop-view.md)。

# DROP DATABASE
<a name="drop-database"></a>

从目录中删除命名的数据库。如果数据库包含表，则必须在运行 `DROP DATABASE` 之前删除这些表或使用 `CASCADE` 子句。`DATABASE` 和 `SCHEMA` 的使用是可互换的。它们具有相同的含义。

## 摘要
<a name="synopsis"></a>

```
DROP {DATABASE | SCHEMA} [IF EXISTS] database_name [RESTRICT | CASCADE]
```

## 参数
<a name="parameters"></a>

**[IF EXISTS]**  
如果 `database_name` 不存在，则会导致错误被隐藏。

**[RESTRICT\$1CASCADE]**  
确定 `database_name` 中的表在 `DROP` 操作过程中如何被看待。如果您指定 `RESTRICT`，则不会删除包含表的数据库。这是默认行为。指定 `CASCADE` 将会导致数据库及其所有表被删除。

## 示例
<a name="examples"></a>

```
DROP DATABASE clickstreams;
```

```
DROP SCHEMA IF EXISTS clickstreams CASCADE;
```

**注意**  
当您尝试删除名称中包含特殊字符（例如 `my-database`）的数据库时，可能会收到一条错误消息。要解决此问题，请尝试用反引号（`）字符将数据库名称括起来。有关 Athena 中数据库命名的信息，请参阅 [命名数据库、表和列](tables-databases-columns-names.md)。

# DROP TABLE
<a name="drop-table"></a>

删除名为 `table_name` 的表的元数据表定义。删除某个外部表时，底层数据将保持不变。

## 摘要
<a name="synopsis"></a>

```
DROP TABLE [IF EXISTS] table_name
```

## 参数
<a name="parameters"></a>

**[ IF EXISTS ]**  
如果 `table_name` 不存在，则会导致错误被隐藏。

## 示例
<a name="examples"></a>

```
DROP TABLE fulfilled_orders
```

```
DROP TABLE IF EXISTS fulfilled_orders
```

使用 Athena 控制台查询编辑器删除具有除下划线 (\$1) 以外的特殊字符的表时，请使用反引号，如以下示例所示。

```
DROP TABLE `my-athena-database-01.my-athena-table`
```

使用 JDBC 连接器删除具有特殊字符的表时，不需要反引号字符。

```
DROP TABLE my-athena-database-01.my-athena-table
```

# DROP VIEW
<a name="drop-view"></a>

丢弃（删除）现有的 Athena 或 AWS Glue Data Catalog 视图。如果该视图不存在，可选 `IF EXISTS` 子句将抑制错误出现。

对于 Data Catalog 视图，仅在 Data Catalog 视图中存在 Athena 视图语法（方言）时，才丢弃 Data Catalog 视图。例如，如果用户从 Athena 调用 `DROP VIEW`，则仅当视图中存在 Athena 的方言时，视图才会被删除。否则，该操作将失败。丢弃 Data Catalog 视图需要 Lake Formation 管理员或视图定义者权限。

有关更多信息，请参阅[使用视图](views.md) 和[在 Athena 中使用 Data Catalog 视图](views-glue.md)。

## 摘要
<a name="synopsis"></a>

```
DROP VIEW [ IF EXISTS ] view_name
```

## 示例
<a name="examples"></a>

```
DROP VIEW orders_by_date
```

```
DROP VIEW IF EXISTS orders_by_date
```

另请参阅[CREATE VIEW 和 CREATE PROTECTED MULTI DIALECT VIEW](create-view.md)、[SHOW COLUMNS](show-columns.md)、[SHOW CREATE VIEW](show-create-view.md)、[SHOW VIEWS](show-views.md) 和 [DESCRIBE VIEW](describe-view.md)。

# MSCK REPAIR TABLE
<a name="msck-repair-table"></a>

在添加与 Hive 兼容的分区后，使用 `MSCK REPAIR TABLE` 命令可更新目录中的元数据。

`MSCK REPAIR TABLE` 命令将扫描在创建表后被添加到文件系统且兼容 Hive 的分区文件系统(例如 Amazon S3)。`MSCK REPAIR TABLE` 将比较表元数据中的分区和 S3 中的分区。如果您在创建表时指定的 S3 位置中存在新分区，则表会将这些分区添加到元数据和 Athena 表中。

在添加物理分区时，目录中的元数据将变得与文件系统中的数据布局不一致，需要将有关新分区的信息添加到目录中。要更新元数据，请运行 `MSCK REPAIR TABLE` 以便从 Athena 查询新分区中的数据。

**注意**  
`MSCK REPAIR TABLE` 仅向元数据添加分区；它不会删除它们。要在 Amazon S3 中手动删除分区后从元数据中删除分区，请运行命令 `ALTER TABLE table-name DROP PARTITION`。有关更多信息，请参阅 [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md)。

## 注意事项和限制
<a name="msck-repair-table-considerations"></a>

在使用 `MSCK REPAIR TABLE` 时，请记住以下几点：
+ 添加所有分区可能需要一些时间。如果此操作超时，它将处于不完整的状态，其中只有少数分区会被添加到目录中。应在同一个表上运行 `MSCK REPAIR TABLE` 语句，直到添加所有分区。有关更多信息，请参阅 [对您的数据进行分区](partitions.md)。
+ 对于不兼容 Hive 的分区，请使用[ALTER TABLE ADD PARTITION](alter-table-add-partition.md)加载分区，以便您可以查询数据。
+ 要与 Athena 结合使用的分区位置必须使用 `s3` 协议（例如，`s3://amzn-s3-demo-bucket/folder/`）。在 Athena 中，当对包含的表运行 `MSCK REPAIR TABLE` 查询时，使用其他协议的位置（例如，`s3a://bucket/folder/`）将导致查询失败。
+ 由于 `MSCK REPAIR TABLE` 同时扫描文件夹及其子文件夹以查找匹配的分区方案，请确保在单独的文件夹层次结构中保留单独表的数据。例如，假设您在 `s3://amzn-s3-demo-bucket1` 中拥有表 1 的数据，在 `s3://amzn-s3-demo-bucket1/table-2-data` 中拥有表 2 的数据。如果两个表都是按字符串分区的，则 `MSCK REPAIR TABLE` 会将表 2 的分区添加到表 1 中。为了避免这种情况，请使用单独的文件夹结构，如 `s3://amzn-s3-demo-bucket1` 和 `s3://amzn-s3-demo-bucket2`。请注意，此行为与 Amazon EMR 和 Apache Hive 一致。
+ 由于已知问题，当分区值包含冒号（`:`）字符时（例如，当分区值为一个时间戳时）`MSCK REPAIR TABLE` 会静默失败。一个解决方法是使用 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)。
+ `MSCK REPAIR TABLE` 不会添加开头为下划线（\$1）的分区列名称。要绕过此限制，使用 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)。

## 摘要
<a name="synopsis"></a>

```
MSCK REPAIR TABLE table_name
```

## 示例
<a name="examples"></a>

```
MSCK REPAIR TABLE orders;
```

## 问题排查
<a name="msck-repair-table-troubleshooting"></a>

运行 `MSCK REPAIR TABLE` 后，如果 Athena 未将分区添加到 AWS Glue Data Catalog 中的表，请检查以下内容：
+ **AWS Glue 访问权限** - 确保 AWS Identity and Access Management（IAM）角色具有允许执行 `glue:BatchCreatePartition` 操作的策略。有关更多信息，请参阅本文后面的[在 IAM policy 中允许 glue:BatchCreatePartition](#msck-repair-table-troubleshooting-allow-gluebatchcreatepartition-in-the-policy)。
+ **Amazon S3 访问权限** – 确保角色具有的策略的权限足以访问 Amazon S3，包括 [https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DescribeJob.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_control_DescribeJob.html) 操作。有关允许哪些 Amazon S3 操作的示例，请参阅 [在 Athena 中配置对 Amazon S3 存储桶的跨账户存取](cross-account-permissions.md) 中的示例存储桶策略。
+ **Amazon S3 对象键大小写** - 确保 Amazon S3 路径为小写而不是驼峰式大小写（例如，`userid` 而不是 `userId`），或者使用 `ALTER TABLE ADD PARTITION` 指定对象键名称。有关更多信息，请参阅本文后面的[更改或重新定义 Amazon S3 路径](#msck-repair-table-troubleshooting-change-or-redefine-the-amazon-s3-path)。
+ **查询超时** – `MSCK REPAIR TABLE` 最适用于首次创建表或在数据和分区元数据之间存在奇偶校验不确定性的情况。如果您使用 `MSCK REPAIR TABLE` 以频繁添加新分区(例如，每天添加)并遇到查询超时，请考虑使用 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md)。
+ **文件系统中缺少分区** - 如果您在 Amazon S3 中手动删除分区，然后运行 `MSCK REPAIR TABLE`，您可能会收到错误消息文件系统中缺少分区。这是因为 `MSCK REPAIR TABLE` 不会从表元数据中删除过时的分区。要从表元数据中移除已删除的分区，请运行 [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md)。请注意，[SHOW PARTITIONS](show-partitions.md) 将类似地仅列出元数据中的分区，而不是文件系统中的分区。
+ **“NullPointerException name is null（NullPointerException 名称为空）”错误**

  如果您将 AWS Glue [CreateTable](https://docs.aws.amazon.com/glue/latest/webapi/API_CreateTable.html) API 操作或 CloudFormation [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html) 模板创建用于 Athena 的表，而不指定 `TableType` 属性，然后运行 DDL 查询，如 `SHOW CREATE TABLE` 或者 `MSCK REPAIR TABLE`，则您将收到错误消息 FAILED: NullPointerException Name is null（失败：NullPointerException 名称为空）。

  要纠正该错误，请为 [TableInput](https://docs.aws.amazon.com/glue/latest/webapi/API_TableInput.html) `TableType` 属性指定值，使其作为 AWS Glue `CreateTable` API 调用或 [CloudFormation 模板](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html)的一部分。`TableType` 可能的值包括 `EXTERNAL_TABLE` 或 `VIRTUAL_VIEW`。

  此要求仅适用于使用 AWS Glue `CreateTable` API 操作或 `AWS::Glue::Table` 模板创建表的情形。如果您适用 DDL 语句或 AWS Glue 爬网程序为 Athena 创建表，则 `TableType` 属性将自动定义。

以下各节提供了一些详细信息。

### 在 IAM policy 中允许 glue:BatchCreatePartition
<a name="msck-repair-table-troubleshooting-allow-gluebatchcreatepartition-in-the-policy"></a>

审核附加到您用于执行 `MSCK REPAIR TABLE` 的角色的 IAM policy。当您[将 AWS Glue Data Catalog 与 Athena 一起使用](data-sources-glue.md)时，IAM policy 必须允许 `glue:BatchCreatePartition` 操作。有关允许 `glue:BatchCreatePartition` 操作的 IAM policy 的示例，请参阅 [AWS 托管策略：AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy)。

### 更改或重新定义 Amazon S3 路径
<a name="msck-repair-table-troubleshooting-change-or-redefine-the-amazon-s3-path"></a>

如果 Amazon S3 路径中的一个或多个对象键采用驼峰式大小写而不是小写，`MSCK REPAIR TABLE` 可能不会将分区添加到 AWS Glue Data Catalog。例如，如果您的 Amazon S3 路径包含对象键名称 `userId`，则可能不会将以下分区添加到 AWS Glue Data Catalog：

```
s3://amzn-s3-demo-bucket/path/userId=1/

s3://amzn-s3-demo-bucket/path/userId=2/

s3://amzn-s3-demo-bucket/path/userId=3/
```

要解决该问题，可以执行下列操作之一：
+ 创建 Amazon S3 对象键时，请使用小写字母而不是驼峰式大小写：

  ```
  s3://amzn-s3-demo-bucket/path/userid=1/
  
  s3://amzn-s3-demo-bucket/path/userid=2/
  
  s3://amzn-s3-demo-bucket/path/userid=3/
  ```
+ 使用 [ALTER TABLE ADD PARTITION](alter-table-add-partition.md) 重新定义位置，如以下示例所示：

  ```
  ALTER TABLE table_name ADD [IF NOT EXISTS]
  PARTITION (userId=1)
  LOCATION 's3://amzn-s3-demo-bucket/path/userId=1/'
  PARTITION (userId=2)
  LOCATION 's3://amzn-s3-demo-bucket/path/userId=2/'
  PARTITION (userId=3)
  LOCATION 's3://amzn-s3-demo-bucket/path/userId=3/'
  ```

请注意，尽管 Amazon S3 对象键名称可以使用大写字母，但 Amazon S3 存储桶名称本身一定要使用小写字母。有关更多信息，请参阅《*Amazon S3 用户指南*》中的[对象键命名指南](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-keys.html#object-key-guidelines)和[存储桶命名规则](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html)。

# SHOW COLUMNS
<a name="show-columns"></a>

仅显示单个指定的表、Athena 视图或 Data Catalog 视图的列名。要获取 Athena 视图的更多详细信息，请改为查询 AWS Glue Data Catalog。有关信息和示例，请参阅 [查询 AWS Glue Data Catalog](querying-glue-catalog.md) 主题中的以下章节：
+ 要查看列元数据（如数据类型），请参阅 [列出或搜索指定表或视图的列](querying-glue-catalog-listing-columns.md)。
+ 要查看 `AwsDataCatalog` 中特定数据库中所有表的所有列，请参阅 [列出或搜索指定表或视图的列](querying-glue-catalog-listing-columns.md)。
+ 要查看 `AwsDataCatalog` 中所有数据库中所有表的所有列，请参阅 [列出所有表的所有列](querying-glue-catalog-listing-all-columns-for-all-tables.md)。
+ 要查看数据库中的特定表的共同列，请参阅 [列出特定的表的共同列](querying-glue-catalog-listing-columns-in-common.md)。

对于 Data Catalog 视图，此语句的输出由 Lake Formation 访问控制进行控制，并且仅显示调用者有权访问的列。

## 摘要
<a name="synopsis"></a>

```
SHOW COLUMNS {FROM|IN} database_name.table_or_view_name
```

```
SHOW COLUMNS {FROM|IN} table_or_view_name [{FROM|IN} database_name]
```

`FROM` 和 `IN` 关键字可互换使用。如果 *table\$1or\$1view\$1name* 或 *database\$1name* 具有诸如连字符之类的特殊字符，请用反引号将名称括起来（例如 ``my-database`.`my-table``）。不要使用单引号或双引号将 *table\$1or\$1view\$1name* 或 *database\$1name* 括起。目前，并不支持使用 `LIKE` 和模式匹配表达式。

## 示例
<a name="examples"></a>

以下等效示例显示了 `customers` 数据库中的 `orders` 表。前两个示例假设 `customers` 是当前数据库。

```
SHOW COLUMNS FROM orders
```

```
SHOW COLUMNS IN orders
```

```
SHOW COLUMNS FROM customers.orders
```

```
SHOW COLUMNS IN customers.orders
```

```
SHOW COLUMNS FROM orders FROM customers
```

```
SHOW COLUMNS IN orders IN customers
```

# SHOW CREATE TABLE
<a name="show-create-table"></a>

分析名为 `table_name` 的现有表以生成创建它的查询。

## 摘要
<a name="synopsis"></a>

```
SHOW CREATE TABLE [db_name.]table_name
```

## 参数
<a name="parameters"></a>

**TABLE [db\$1name.]table\$1name**  
`db_name` 参数是可选的。如果省略，则上下文默认为当前数据库。  
表名称是必需的。

## 示例
<a name="examples"></a>

```
SHOW CREATE TABLE orderclickstoday;
```

```
SHOW CREATE TABLE `salesdata.orderclickstoday`;
```

## 故障排除
<a name="show-create-table-troubleshooting"></a>

如果您将 AWS Glue [CreateTable](https://docs.aws.amazon.com/glue/latest/webapi/API_CreateTable.html) API 操作或 CloudFormation [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-glue-table.html) 模板创建用于 Athena 的表，而不指定 `TableType` 属性，然后运行 DDL 查询，如 `SHOW CREATE TABLE` 或者 `MSCK REPAIR TABLE`，则您将收到错误消息失败：NullPointerException 名称为空。

要纠正该错误，请为 [TableInput](https://docs.aws.amazon.com/glue/latest/webapi/API_TableInput.html) `TableType` 属性指定值，使其作为 AWS Glue `CreateTable` API 调用或 [CloudFormation 模板](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-glue-table-tableinput.html)的一部分。`TableType` 可能的值包括 `EXTERNAL_TABLE` 或 `VIRTUAL_VIEW`。

此要求仅适用于使用 AWS Glue `CreateTable` API 操作或 `AWS::Glue::Table` 模板创建表的情形。如果您适用 DDL 语句或 AWS Glue 爬网程序为 Athena 创建表，则 `TableType` 属性将自动定义。

# SHOW CREATE VIEW
<a name="show-create-view"></a>

显示创建指定的 Athena 或 Data Catalog 视图的 SQL 语句。返回的 SQL 显示了 Athena 中使用的创建视图语法。对 Data Catalog 视图调用 `SHOW CREATE VIEW` 需要 Lake Formation 管理员或视图定义者权限。

## 摘要
<a name="synopsis"></a>

```
SHOW CREATE VIEW view_name
```

## 示例
<a name="examples"></a>

```
SHOW CREATE VIEW orders_by_date
```

另请参阅 [CREATE VIEW 和 CREATE PROTECTED MULTI DIALECT VIEW](create-view.md) 和 [DROP VIEW](drop-view.md)。

# SHOW DATABASES
<a name="show-databases"></a>

列出元存储中定义的所有数据库。您可以使用 `DATABASES` 或 `SCHEMAS`。它们具有相同的含义。

`SHOW DATABASES` 的编程等效项是 [ListDatabases](https://docs.aws.amazon.com/athena/latest/APIReference/API_ListDatabases.html) Athena API 操作。适用于 Python (Boto3) 的 AWS SDK 中的等效方法是 [list\$1databases](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/athena/client/list_databases.html)。

## 摘要
<a name="synopsis"></a>

```
SHOW {DATABASES | SCHEMAS} [LIKE 'regular_expression']
```

## 参数
<a name="parameters"></a>

**[LIKE '*regular\$1expression*']**  
从数据库列表中筛选出那些与您指定的 `regular_expression` 匹配的数据库。对于通配符匹配，您可以使用组合 `.*`，它将任何字符匹配 0 到无限次。

## 示例
<a name="examples"></a>

```
SHOW SCHEMAS;
```

```
SHOW DATABASES LIKE '.*analytics';
```

# SHOW PARTITIONS
<a name="show-partitions"></a>

按未排序顺序列出 Athena 表中的所有分区。

## 摘要
<a name="synopsis"></a>

```
SHOW PARTITIONS table_name
```
+ 要显示表中的分区并按特定顺序列出分区，请参阅[查询 AWS Glue Data Catalog](querying-glue-catalog.md)页面上的[列出特定表的分区](querying-glue-catalog-listing-partitions.md)部分。
+ 要查看分区的内容，请参阅[对您的数据进行分区](partitions.md)页面上的[查询数据](partitions.md#query-the-data)部分。
+ `SHOW PARTITIONS` 不会列出由 Athena 投影但未在 AWS Glue 目录中注册的分区。有关分区投影的信息，请参阅[将分区投影与 Amazon Athena 结合使用](partition-projection.md)。
+  `SHOW PARTITIONS` 将列出元数据中的分区，而不是实际文件系统中的分区。要在 Amazon S3 中手动删除分区后更新元数据，请运行 [ALTER TABLE DROP PARTITION](alter-table-drop-partition.md)。

## 示例
<a name="examples"></a>

以下示例查询显示了 `flight_delays_csv` 表的分区，其中显示了来自美国运输部的飞行表数据。有关使用示例 `flight_delays_csv` 表的更多信息，请参阅 [用于 CSV、TSV 和自定义分隔文件的 Lazy Simple SerDe](lazy-simple-serde.md)。表按年份进行分区。

```
SHOW PARTITIONS flight_delays_csv
```

**结果**

```
year=2007
year=2015
year=1999
year=1993
year=1991
year=2003
year=1996
year=2014
year=2004
year=2011
...
```

以下示例查询显示了 `impressions` 表的分区，其中包含示例 Web 浏览数据。有关使用示例 `impressions` 表的更多信息，请参阅 [对您的数据进行分区](partitions.md)。该表按照 `dt`(日期时间)列进行分区。

```
SHOW PARTITIONS impressions
```

**结果**

```
dt=2009-04-12-16-00
dt=2009-04-13-18-15
dt=2009-04-14-00-20
dt=2009-04-12-13-00
dt=2009-04-13-02-15
dt=2009-04-14-12-05
dt=2009-04-14-06-15
dt=2009-04-12-21-15
dt=2009-04-13-22-15
...
```

### 按排序顺序列出分区
<a name="show-partitions-examples-ordering"></a>

要在结果列表中对分区进行排序，请使用以下 `SELECT` 语法，而不是 `SHOW PARTITIONS`。

```
SELECT * FROM database_name."table_name$partitions" ORDER BY column_name
```

以下查询显示了 `flight_delays_csv` 示例的分区列表，但按排序顺序排列。

```
SELECT * FROM "flight_delays_csv$partitions" ORDER BY year
```

**结果**

```
year
1987
1988
1989
1990
1991
1992
1993
1994
1995
1996
1997
1998
1999
...
```

有关更多信息，请参阅 [查询 AWS Glue Data Catalog](querying-glue-catalog.md) 页面上的 [列出特定表的分区](querying-glue-catalog-listing-partitions.md) 部分。

# SHOW TABLES
<a name="show-tables"></a>

列出数据库中的所有基本表和视图。

**注意**  
在 [GetQueryExecution](https://docs.aws.amazon.com/athena/latest/APIReference/API_GetQueryExecution.html) API 操作中，`SHOW TABLES` 的 [StatementType](https://docs.aws.amazon.com/athena/latest/APIReference/API_QueryExecution.html#athena-Type-QueryExecution-StatementType) 参数被归类为 `UTILITY`，而不是 `DDL`。

## 摘要
<a name="synopsis"></a>

```
SHOW TABLES [IN database_name] ['regular_expression']
```

## 参数
<a name="parameters"></a>

**[IN database\$1name]**  
指定将列出其表的 `database_name`。如果省略，则会采用当前上下文中的数据库。  
如果 `database_name` 使用[不支持的字符](tables-databases-columns-names.md)（比如连字符），则 `SHOW TABLES` 可能失败。作为一种解决方法，请尝试用反引号将数据库名称括起来。

**['regular\$1expression']**  
从表的列表中筛选出那些符合您指定的 `regular_expression` 的表。要指示 `AWSDataCatalog` 表中的任何字符，您可以使用 `*` 或者 `.*` 通配符表达式。对于 Apache Hive 数据库，请使用 `.*` 通配符表达式。要指示字符之间的选择，请使用 `|` 字符。

## 示例
<a name="examples"></a>

**Example – 显示数据库 `sampledb` 中的所有表**  

```
SHOW TABLES IN sampledb
```
`Results`  

```
alb_logs
cloudfront_logs
elb_logs
flights_2016
flights_parquet
view_2016_flights_dfw
```

**Example – 显示 `sampledb` 中包含单词“flights”的所有表的名称**  

```
SHOW TABLES IN sampledb '*flights*'
```
`Results`  

```
flights_2016
flights_parquet
view_2016_flights_dfw
```

**Example – 显示 `sampledb` 中以单词“log”结尾的所有表的名称**  

```
SHOW TABLES IN sampledb '*logs'
```
`Results`  

```
alb_logs
cloudfront_logs
elb_logs
```

# SHOW TBLPROPERTIES
<a name="show-tblproperties"></a>

列出命名表的表属性。

## 摘要
<a name="synopsis"></a>

```
SHOW TBLPROPERTIES table_name [('property_name')]
```

## 参数
<a name="parameters"></a>

**[('property\$1name')]**  
如果包含，则只会列出名为 `property_name` 的属性的值。

## 示例
<a name="examples"></a>

```
SHOW TBLPROPERTIES orders;
```

```
SHOW TBLPROPERTIES orders('comment');
```

# SHOW VIEWS
<a name="show-views"></a>

在 `STRING` 类型值列表中列出 Athena 视图或 Data Catalog 视图。列表中的每个值是指定数据库或当前数据库（如果省略数据库的名称）中的视图名称。将可选 `LIKE` 子句与一个正则表达式结合使用来限制视图名称列表。对于 Data Catalog 视图，仅列出使用 Athena SQL 语法的视图。其他 Data Catalog 视图已被筛选掉。

## 摘要
<a name="synopsis"></a>

```
SHOW VIEWS [IN database_name] [LIKE 'regular_expression']
```

### 参数
<a name="parameters"></a>

**[IN database\$1name]**  
指定将列出其视图的 `database_name`。如果省略，则会采用当前上下文中的数据库。

**[LIKE 'regular\$1expression']**  
从视图列表中筛选出那些符合您指定的 `regular_expression` 的视图。只能使用表示任何字符的通配符 `*` 或表示在字符间进行选择的 `|`。

## 示例
<a name="examples"></a>

```
SHOW VIEWS
```

```
SHOW VIEWS IN marketing_analytics LIKE 'orders*'
```

另请参阅 [SHOW COLUMNS](show-columns.md)、[SHOW CREATE VIEW](show-create-view.md)、[DESCRIBE VIEW](describe-view.md) 和 [DROP VIEW](drop-view.md)。