

# 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` 查询。