

# 使用外部 Hive 元存储
<a name="connect-to-data-source-hive"></a>

您可以使用外部 Hive 元存储的 Amazon Athena 数据连接器来查询 Amazon S3 中使用 Apache Hive 元存储的数据集。无需将元数据迁移到 AWS Glue Data Catalog。在 Athena 管理控制台中，配置 Lambda 函数以与私有 VPC 中的 Hive 元存储进行通信，然后将它连接到元存储。从 Lambda 到 Hive 元存储的连接由私有 Amazon VPC 通道提供保护，并且不使用公共 Internet。您可以提供您自己的 Lambda 函数代码，也可以使用外部 Hive 元存储的 Athena 数据连接器的默认实施。

**Topics**
+ [功能概览](#connect-to-a-data-source-hive-features)
+ [工作流](#connect-to-data-source-hive-workflow)
+ [注意事项和限制](#connect-to-a-data-source-hive-considerations)
+ [将 Athena 连接到 Apache Hive 元存储](connect-to-data-source-hive-connecting-athena-to-an-apache-hive-metastore.md)
+ [使用 AWS Serverless Application Repository 部署 Hive 数据来源连接器](connect-data-source-sar-hive.md)
+ [使用现有 IAM 执行角色将 Athena 连接到 Hive 元存储](connect-data-source-hive-existing-iam-role.md)
+ [配置 Athena 使用部署的 Hive 元存储连接器](connect-data-source-hive-existing-lambda.md)
+ [省略外部 Hive 元存储查询中的目录名称](datastores-hive-default-catalog.md)
+ [使用 Hive 视图](hive-views.md)
+ [将 AWS CLI 与 Hive 元存储结合使用](datastores-hive-cli.md)
+ [修改 Athena 外部 Hive 元存储连接器](datastores-hive-reference-implementation.md)

## 功能概览
<a name="connect-to-a-data-source-hive-features"></a>

利用外部 Hive 元存储的 Athena 数据连接器，您可以执行以下任务：
+ 使用 Athena 控制台注册自定义目录并使用这些目录运行查询。
+ 为不同的外部 Hive 元存储定义 Lambda 函数，并在 Athena 查询中联接它们。
+ 在同一 Athena 查询中使用 AWS Glue Data Catalog 和您的外部 Hive 元数据仓。
+ 在查询执行上下文中指定目录作为当前默认目录。这样一来，便无需在查询中将目录名称置于数据库名称的前面。您可以使用 `database.table`，而不是使用语法 `catalog.database.table`。
+ 使用各种工具运行引用外部 Hive 元存储的查询。您可以使用 Athena 控制台、AWS CLI、AWS 软件开发工具包以及更新的 Athena JDBC 和 ODBC 驱动程序。更新后的驱动程序支持自定义目录。

### API 支持
<a name="connect-to-a-data-source-hive-features-api"></a>

适用于外部 Hive 元数据仓的 Athena 数据连接器包含对目录注册 API 操作和元数据 API 操作的支持。
+ **目录注册** – 为外部 Hive 元数据仓和[联合数据源](federated-queries.md)注册自定义目录。
+ **元数据** – 使用元数据 API 为 AWS Glue 和任何注册到 Athena 目录提供数据库和表信息。
+ **Athena JAVA 软件开发工具包客户端** – 在更新后的 Athena JAVA 软件开发工具包客户端上的 `StartQueryExecution` 操作中使用目录注册 API、元数据 API 并支持目录。

### 参考实现
<a name="connect-to-a-data-source-hive-features-reference-implementation"></a>

Athena 提供连接到外部 Hive 元存储的 Lambda 函数的参考实施。参考实现在 GitHub 上作为 [Athena Hive 元存储](https://github.com/awslabs/aws-athena-hive-metastore)的开源项目提供。

参考实施在 AWS Serverless Application Repository (SAR) 中作为以下两种 AWS SAM 应用程序提供。您可以在 SAR 中使用这两种应用程序之一来创建您自己的 Lambda 函数。
+ `AthenaHiveMetastoreFunction` – Uber Lambda 函数 `.jar` 文件。“uber”JAR（也称为 fat JAR 或具有依赖关系的 JAR）是 `.jar` 文件，该文件在单个文件中同时包含 Java 程序及其依赖关系。
+ `AthenaHiveMetastoreFunctionWithLayer` – Lambda 层和 thin Lambda 函数 `.jar` 文件。

## 工作流
<a name="connect-to-data-source-hive-workflow"></a>

下图说明了 Athena 如何与外部 Hive 元数据仓进行交互。

![\[Athena 如何与外部 Hive 元数据仓进行交互。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/connect-to-data-source-hive-workflow.png)


在此工作流程中，您的数据库连接的 Hive 元存储位于您的 VPC 中。您使用 Hive Server2 通过 Hive CLI 管理 Hive 元存储。

使用来自 Athena 的外部 Hive 元数据仓的工作流程包括以下步骤。

1. 创建一个 Lambda 函数以将 Athena 连接到 VPC 中的 Hive 元数据仓。

1. 为 Hive 元存储注册唯一目录名称，并在账户中注册相应的函数名称。

1. 当您运行使用目录名称的 Athena DML 或 DDL 查询时，Athena 查询引擎将调用与目录名称关联的 Lambda 函数名称。

1. 使用 AWS PrivateLink，Lambda 函数与 VPC 中的外部 Hive 元数据仓进行通信，并接收对元数据请求的响应。Athena 使用外部 Hive 元数据仓中的元数据，就像使用默认 AWS Glue Data Catalog 中的元数据一样。

## 注意事项和限制
<a name="connect-to-a-data-source-hive-considerations"></a>

在为外部 Hive 元数据仓使用 Athena 数据连接器时，请考虑以下几点：
+ 您可以使用 CTAS 在外部 Hive 元存储上创建表。
+ 您可以使用 INSERT INTO 将数据插入到外部 Hive 元存储中。
+ 对外部 Hive 元数据仓的 DDL 支持仅限于以下语句。
  + ALTER DATABASE SET DBPROPERTIES
  + ALTER TABLE ADD COLUMNS
  + ALTER TABLE ADD PARTITION
  + ALTER TABLE DROP PARTITION
  + ALTER TABLE RENAME PARTITION
  + ALTER TABLE REPLACE COLUMNS
  + ALTER TABLE SET LOCATION
  + ALTER TABLE SET TBLPROPERTIES
  + CREATE DATABASE
  + CREATE TABLE
  + CREATE TABLE AS
  + DESCRIBE TABLE
  + DROP DATABASE
  + DROP TABLE
  + SHOW COLUMNS
  + SHOW CREATE TABLE
  + SHOW PARTITIONS
  + SHOW SCHEMAS
  + SHOW TABLES
  + SHOW TBLPROPERTIES
+ 您可以拥有的已注册目录的最大数量为 1000。
+ 无法对 Hive 元存储进行 Kerberos 身份验证。
+ 若要将 JDBC 驱动程序与外部 Hive 元数据仓或[联合查询](federated-queries.md)结合使用，请在 JDBC 连接字符串中包含 `MetadataRetrievalMethod=ProxyAPI`。有关 JDBC 驱动程序的信息，请参阅 [通过 JDBC 连接到 Amazon Athena](connect-with-jdbc.md)。
+ Hive 隐藏列 `$path`、`$bucket`、`$file_size`、`$file_modified_time`、`$partition`、`$row_id` 不能用于精细访问控制筛选。
+ Hive 的隐藏系统表，例如 `example_table$partitions` 或 `example_table$properties`，不支持精细访问控制。

### 权限
<a name="connect-to-a-data-source-hive-considerations-permissions"></a>

预构建和自定义数据连接器可能需要访问以下资源才能正常工作。检查您使用的连接器的信息，以确保您已正确配置 VPC。有关在 Athena 中运行查询和创建数据源连接器所需的 IAM 权限的信息，请参阅 [允许访问适用于外部配置 Hive 元存储的 Athena 数据连接器](hive-metastore-iam-access.md) 和 [允许 Lambda 函数访问外部 Hive 元存储](hive-metastore-iam-access-lambda.md)。
+ **Amazon S3** – 除了将查询结果写入 Amazon S3 中的 Athena 查询结果位置之外，数据连接器还会写入到 Amazon S3 中的溢出存储桶。此 Amazon S3 位置的连接和权限是必需的。有关更多信息，请参阅本主题后面的[Amazon S3 中的溢出位置](#connect-to-data-source-hive-spill-location)。
+ **Athena** – 需要访问权限才能检查查询状态并防止过度扫描。
+ **AWS Glue** – 如果您的连接器将 AWS Glue 用于补充元数据或主元数据，则需要访问权限。
+ **AWS Key Management Service**
+ **策略** – 除了 [AWS 托管策略：AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy)，Hive 元数据仓、Athena Query Federation 和 UDF 需要策略。有关更多信息，请参阅 [Athena 中的 Identity and Access Management](security-iam-athena.md)。

### Amazon S3 中的溢出位置
<a name="connect-to-data-source-hive-spill-location"></a>

由于对 Lambda 函数响应大小的[限制](https://docs.aws.amazon.com/lambda/latest/dg/limits.html)，则大于阈值的响应会溢出到您在创建 Lambda 函数时指定的 Amazon S3 位置。Athena 直接从 Amazon S3 读取这些响应。

**注意**  
Athena 不会删除 Amazon S3 上的响应文件。我们建议您设置保留策略以自动删除响应文件。

# 将 Athena 连接到 Apache Hive 元存储
<a name="connect-to-data-source-hive-connecting-athena-to-an-apache-hive-metastore"></a>

要将 Athena 连接到 Apache Hive 元数据仓，您必须创建和配置 Lambda 函数。对于基本实现，您可以从 Athena 管理控制台执行所有必需步骤。

**注意**  
以下过程要求您具有为 Lambda 函数创建自定义 IAM 角色的权限。如果您没有权限创建自定义角色，则可以使用 Athena [参考实现](connect-to-data-source-hive.md#connect-to-a-data-source-hive-features-reference-implementation)以单独创建 Lambda 函数，然后使用 AWS Lambda 控制台，为函数选择现有 IAM 角色。有关更多信息，请参阅 [使用现有 IAM 执行角色将 Athena 连接到 Hive 元存储](connect-data-source-hive-existing-iam-role.md)。

**要将 Athena 连接到 Hive 元数据仓**

1. 从 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 打开 Athena 控制台。

1. 如果控制台导航窗格不可见，请选择左侧的扩展菜单。  
![\[选择扩展菜单。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/nav-pane-expansion.png)

1. 选择**数据来源和目录**。

1. 在控制台右上角，选择 **Connect data source**（连接数据源）。

1. 在 **Choose a data sources**（选择数据源）页面中，对于 **Data source**（数据源），请选择 **S3 - Apache Hive metastore**（S3 - Apache Hive 元数据仓）。

1. 选择**下一步**。

1. 在 **Data source details**（数据源详细信息）部分，对于 **Data source name**（数据源名称），输入从 Athena 查询数据源时想要在 SQL 语句中使用的名称。名称最多可以包括 127 个字符，并且在您的账户中必须是唯一的。它在创建后即无法更改。有效字符包括 a-z、A-Z、0-9、\$1（下划线）、@（at 符号）和 -（连字符）。名称 `awsdatacatalog`、`hive`、`jmx` 和 `system` 是 Athena 预留的名称，无法用于数据源名称。

1. 对于 **Lambda function**（Lambda 函数），选择 **Create Lambda function**（创建 Lambda 函数），然后选择 **Create a new Lambda function in AWS Lambda**（在 中新建 Lambda 函数）

   **AthenaHiveMetastoreFunction** 页面将会在 AWS Lambda 控制台中打开。该页面包括连接器的详细信息。  
![\[AWS Lambda 控制台中的 AthenaHiveMetastoreFunction 页面。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/connect-to-data-source-hive-4.png)

1. 在 **Application settings**（应用程序设置）中，输入 Lambda 函数的参数。
   + **LambdaFuncName** – 提供函数的名称。例如，**myHiveMetastore**。
   + **SpillLocation** – 在此账户中指定 Amazon S3 位置，以便在 Lambda 函数响应大小超过 4 MB 时保存溢出元数据。
   + **HMSUris** – 输入您的 Hive 元数据仓主机的名称，该主机在端口 9083 使用 Thrift 协议。使用语法 `thrift://<host_name>:9083`。
   + **LambdaMemory** – 指定从 128 MB 到 3008 MB 的值。Lambda 函数分配与您配置的内存量成比例的 CPU 周期。默认值为 1024。
   + **LambdaTimeout** – 指定允许的最大 Lambda 调用运行时（以秒为单位），从 1 到 900（900 秒为 15 分钟）。默认值为 300 秒（5 分钟）。
   + **VpcSecurityGroupIds** – 为 Hive 元数据仓输入一个逗号分隔的 VPC 安全组 ID 列表。
   + **VpcSubneIds** – 为 Hive 元数据仓输入一个逗号分隔的 VPC 子网 ID 列表。

1. 选择 **I acknowledge that this app creates custom IAM roles**（我确认此应用程序创建自定义 IAM 角色），然后选择 **Deploy**（部署）。  
![\[从 AWS Lambda 控制台部署 Lambda 函数应用程序。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/connect-to-data-source-hive-4a.png)

   部署完成后，函数将显示在 Lambda 应用程序列表中。现在 Hive 元数据仓功能已部署到您的账户，您可以配置 Athena 配置以使用此功能。

1. 返回至 Athena 控制台中的 **Enter data source details**（输入数据源详细信息）页面。

1. 在 **Lambda function**（Lambda 函数）部分，选择 Lambda 函数搜索框旁的刷新图标。刷新可用函数列表会导致新创建的函数出现在列表中。

1. 在 Lambda 控制台上选择刚创建的函数名称。将显示 Lambda 函数的 ARN。

1. （可选）对于 **Tags**（标签），添加要与此数据源关联的键值对。有关标签的更多信息，请参阅[标记 Athena 资源](tags.md)。

1. 选择**下一步**。

1. 在 **Review and create**（审核和创建）页面中，查看数据源的详细信息，然后选择 **Create data source**（创建数据源）。

1. 数据源此页面的 **Data source details**（数据源详细信息）部分显示了有关新连接器的信息。

   您现在可以使用指定的 **Data source name**（数据源名称）以在 Athena 的 SQL 查询中引用 Hive 元数据仓。在 SQL 查询中，使用以下示例语法，并将 `hms-catalog-1` 替换为您之前指定的目录名称。

   ```
   SELECT * FROM hms-catalog-1.CustomerData.customers 
   ```

1. 有关查看、编辑或删除您创建的数据源的信息，请参阅 [管理您的数据来源](data-sources-managing.md)。

# 使用 AWS Serverless Application Repository 部署 Hive 数据来源连接器
<a name="connect-data-source-sar-hive"></a>

要部署适用于 Hive 的 Athena 数据来源连接器，您可以使用 [AWS Serverless Application Repository](https://aws.amazon.com/serverless/serverlessrepo/)，而不是从 Athena 控制台开始。使用 AWS Serverless Application Repository 找到要使用的连接器，提供连接器所需的参数，然后将连接器部署到您的账户。部署连接器后，您可以使用 Athena 控制台向 Athena 提供数据来源。

**使用 AWS Serverless Application Repository 将适用于 Hive 的数据来源连接器部署到您的账户**

1. 登录 AWS 管理控制台并打开 **Serverless App Repository (无服务器应用程序存储库)**。

1. 在导航窗格中，选择 **Available applications (可用应用程序)**。

1. 选择 **Show apps that create custom IAM roles or resource policies**（显示创建自定义 IAM 角色或资源策略的应用程序）选项。

1. 在搜索框中，输入 **Hive**。显示的连接器包括以下两个：
   + **AthenaHiveMetastoreFunction** – Uber Lambda 函数 `.jar` 文件。
   + **AthenaHiveMetastoreFunctionWithLayer** – Lambda 层和 thin Lambda 函数 `.jar` 文件。

    这两个应用程序具有相同的功能，仅在实施方面存在差异。您可以使用二者之一创建将 Athena 连接到 Hive 元数据仓的 Lambda 函数。

1. 选择要使用的连接器名称。本教程使用 **AthenaHiveMetastoreFunction**。  
![\[选择适用于 Hive 的 Athena 数据来源连接器的名称。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/connect-data-source-sar-hive-1.png)

1. 在 **Application settings**（应用程序设置）中，输入 Lambda 函数的参数。
   + **LambdaFuncName** – 提供函数的名称。例如，**myHiveMetastore**。
   + **SpillLocation** – 在此账户中指定 Amazon S3 位置，以便在 Lambda 函数响应大小超过 4 MB 时保存溢出元数据。
   + **HMSUris** – 输入您的 Hive 元数据仓主机的名称，该主机在端口 9083 使用 Thrift 协议。使用语法 `thrift://<host_name>:9083`。
   + **LambdaMemory** – 指定从 128 MB 到 3008 MB 的值。Lambda 函数分配与您配置的内存量成比例的 CPU 周期。默认值为 1024。
   + **LambdaTimeout** – 指定允许的最大 Lambda 调用运行时（以秒为单位），从 1 到 900（900 秒为 15 分钟）。默认值为 300 秒（5 分钟）。
   + **VpcSecurityGroupIds** – 为 Hive 元数据仓输入一个逗号分隔的 VPC 安全组 ID 列表。
   + **VpcSubneIds** – 为 Hive 元数据仓输入一个逗号分隔的 VPC 子网 ID 列表。

1. 在 **Application details**（应用程序详细信息）页面的右下角，选择 **I acknowledge that this app creates custom IAM roles**（我确认此应用程序创建自定义 IAM 角色），然后选择 **Deploy**（部署）。

此时，您可以将 Athena 配置为使用 Lambda 函数连接到 Hive 元数据仓。要查看步骤，请参阅[配置 Athena 使用部署的 Hive 元存储连接器](connect-data-source-hive-existing-lambda.md)。

# 使用现有 IAM 执行角色将 Athena 连接到 Hive 元存储
<a name="connect-data-source-hive-existing-iam-role"></a>

要借助使用现有 IAM 角色的 Lambda 函数将外部 Hive 元数据仓连接到 Athena，您可以将 Athena 的 Athena 连接器引用实现用于外部 Hive 元数据仓。

这三个主要步骤如下所示：

1. **[克隆和构建](#connect-data-source-hive-existing-iam-role-clone-and-build-the-lambda-function)**：克隆 Athena 引用实现并构建包含 Lambda 函数代码的 JAR 文件。

1. **[AWS Lambda 控制台](#connect-data-source-hive-existing-iam-role-aws-lambda-console)** – 在 AWS Lambda 控制台，创建 Lambda 函数，为其分配现有 IAM 执行角色，然后上载您生成的函数代码。

1. **[Amazon Athena 控制台](connect-data-source-hive-existing-lambda.md)** – 在 Amazon Athena 控制台中，创建一个数据来源名称，您可以使用该名称在 Athena 查询中引用外部 Hive 元存储。

如果您已拥有创建自定义 IAM 角色的权限，则可以使用更简单的工作流程，该工作流程使用 Athena 控制台和 AWS Serverless Application Repository 创建和配置 Lambda 函数。有关更多信息，请参阅 [将 Athena 连接到 Apache Hive 元存储](connect-to-data-source-hive-connecting-athena-to-an-apache-hive-metastore.md)。

## 先决条件
<a name="connect-data-source-hive-existing-iam-role-prerequisites"></a>
+ Git 必须安装在您的系统上。
+ 您必须先行安装 [Apache Maven](https://maven.apache.org/)。
+ 您有一个 IAM 执行角色，可以将其分配给 Lambda 函数。有关更多信息，请参阅 [允许 Lambda 函数访问外部 Hive 元存储](hive-metastore-iam-access-lambda.md)。

## 克隆并构建 Lambda 函数
<a name="connect-data-source-hive-existing-iam-role-clone-and-build-the-lambda-function"></a>

Athena 参考实现的函数代码是一个位于 GitHub 上的 Maven 项目，具体地址为 [awslabs/aws-athena-hive-metastore](https://github.com/awslabs/aws-athena-hive-metastore)。有关项目的详细信息，请参阅 GitHub 上相应的自述文件或本文档中的 [修改 Athena 外部 Hive 元存储连接器](datastores-hive-reference-implementation.md) 主题。

**克隆和构建 Lambda 函数代码**

1. 输入以下命令以克隆 Athena 引用实现：

   ```
   git clone https://github.com/awslabs/aws-athena-hive-metastore
   ```

1. 运行以下命令为 Lambda 函数构建 `.jar` 文件：

   ```
   mvn clean install
   ```

   项目构建成功后，以下 `.jar` 文件将在项目的目标文件夹中创建：

   `hms-lambda-func-1.0-SNAPSHOT-withdep.jar`

   在下一部分中，您将使用 AWS Lambda 控制台将此文件上载到 Amazon Web Services 账户。

## 在 AWS Lambda 控制台中创建和配置 Lambda 函数
<a name="connect-data-source-hive-existing-iam-role-aws-lambda-console"></a>

在本节中，您将使用 AWS Lambda 控制台创建一个使用现有 IAM 执行角色的函数。为函数配置 VPC 后，您可以上载函数代码并配置该函数的环境变量。

### 创建 Lambda 函数
<a name="connect-data-source-hive-existing-iam-role-create-the-lambda-function"></a>

在此步骤中，您将在 AWS Lambda 控制台中创建一个使用现有 IAM 角色的函数。

**要创建使用现有 IAM 角色的 Lambda 函数**

1. 登录到 AWS 管理控制台，然后通过以下网址打开 AWS Lambda 控制台：[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)。

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

1. 选择**创建函数**。

1. 选择**从头开始创作**。

1. 在 **Function name**（函数名称）中，输入 Lambda 函数的名称（例如 **EHMSBasedLambda**）。

1. 对于 **Runtime**（运行时），请选择 **Java 8**。

1. 在 **Permissions**（权限）下，展开 **Change default execution role**（更改默认执行角色）。

1. 对于 **Execution role (执行角色)**，选择 **Use an existing role (使用现有角色)**。

1. 对于 **Existing role**（现有角色），请选择 Lambda 函数将用于 Athena 的 IAM 执行角色（此示例使用名为 `AthenaLambdaExecutionRole` 的角色)。

1. 展开 **Advanced settings**（高级设置）。

1. 选择 **Enable Network**（启用网络）。

1. 对于 **VPC**，请选择您的函数将有权访问的 VPC。

1. 对于 **Subnets**（子网），选择 Lambda 要使用的 VPC 子网。

1. 对于 **Security groups**（安全组），选择 Lambda 要使用的 VPC 安全组。

1. 选择**创建函数**。AWS Lambda 控制台，然后打开函数的配置页面并开始创建函数。

### 上载代码并配置 Lambda 函数
<a name="connect-data-source-hive-existing-iam-role-upload-and-configure"></a>

当控制台通知您已成功创建函数时，您就可以上载函数代码并配置其环境变量。

**上载 Lambda 函数代码并配置其环境变量**

1. 在 Lambda 控制台中，确保您位于指定函数页面的 **Code**（代码）选项卡上。

1. 对于 **Code source**（代码源），选择 **Upload from**（上传格式），然后选择 **.zip or .jar file**（.zip 或 .jar 文件）。

1. 上载您之前生成的 `hms-lambda-func-1.0-SNAPSHOT-withdep.jar` 文件。

1. 在 Lambda 函数页面上，选择**配置**选项卡。

1. 从左侧窗格中选择 **Environment variables**（环境变量）。

1. 在 **Environment variables (环境变量)** 部分中，选择 **Edit (编辑)**。  
![\[选择 Edit（编辑）为 Lambda 函数编辑环境变量。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/connect-data-source-hive-existing-iam-role-5.png)

1. 在 **Edit environment variables**（编辑环境变量）页面上，使用 **Add environment variable**（添加环境变量）选项，添加以下环境变量键和值：
   + **HMS\$1URIS** – 使用以下语法，输入 Hive 元数据仓主机的 URI，该主机在端口 9083 使用 Thrift 协议。

     ```
     thrift://<host_name>:9083
     ```
   + **SPILL\$1LOCATION** – 在 Amazon Web Services 账户中指定 Amazon S3 位置，以便在 Lambda 函数响应大小超过 4MB 时保存溢出元数据。  
![\[为 Lambda 函数环境变量指定值。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/connect-data-source-hive-existing-iam-role-6.png)

1. 选择**保存**。

此时，您已准备好将 Athena 配置为使用 Lambda 函数连接到 Hive 元数据仓。要查看步骤，请参阅[配置 Athena 使用部署的 Hive 元存储连接器](connect-data-source-hive-existing-lambda.md)。

# 配置 Athena 使用部署的 Hive 元存储连接器
<a name="connect-data-source-hive-existing-lambda"></a>

将 `AthenaHiveMetastoreFunction` 等 Lambda 数据源连接器部署到账户后，您可以配置 Athena 以进行使用。为此，请创建数据源名称，该名称会引用外部 Hive 元数据仓以在 Athena 查询中使用。

**使用现有 Lambda 函数将 Athena 连接到 Hive 元数据仓**

1. 从 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 打开 Athena 控制台。

1. 如果控制台导航窗格不可见，请选择左侧的扩展菜单。  
![\[选择扩展菜单。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/nav-pane-expansion.png)

1. 选择**数据来源和目录**。

1. 在**数据来源和目录**页面上，选择**创建数据来源**。

1. 在 **Choose a data sources**（选择数据源）页面中，对于 **Data source**（数据源），请选择 **S3 - Apache Hive metastore**（S3 - Apache Hive 元数据仓）。

1. 选择**下一步**。

1. 在 **Data source details**（数据源详细信息）部分中，对于 **Data source name**（数据源名称），请输入从 Athena 查询数据源时要在 SQL 语句中使用的名称（例如 `MyHiveMetastore`）。名称最多可以包括 127 个字符，并且在您的账户中必须是唯一的。它在创建后即无法更改。有效字符包括 a-z、A-Z、0-9、\$1（下划线）、@（at 符号）和 -（连字符）。名称 `awsdatacatalog`、`hive`、`jmx` 和 `system` 是 Athena 预留的名称，无法用于数据源名称。

1. 在 **Connection details**（连接详细信息）部分中，请使用 **Select or enter a Lambda function**（选择或输入 Lambda 函数）框以选择刚创建的函数名称。将显示 Lambda 函数的 ARN。

1. （可选）对于 **Tags**（标签），添加要与此数据源关联的键值对。有关标签的更多信息，请参阅[标记 Athena 资源](tags.md)。

1. 选择**下一步**。

1. 在 **Review and create**（审核和创建）页面中，查看数据源的详细信息，然后选择 **Create data source**（创建数据源）。

1. 数据源此页面的 **Data source details**（数据源详细信息）部分显示了有关新连接器的信息。

   您现在可以使用指定的 **Data source name**（数据源名称）以在 Athena 的 SQL 查询中引用 Hive 元数据仓。

   在 SQL 查询中，使用以下示例语法，并将 `ehms-catalog` 替换为您之前指定的数据源名称。

   ```
   SELECT * FROM ehms-catalog.CustomerData.customers 
   ```

1. 要查看、编辑或删除您创建的数据源，请参阅[管理您的数据来源](data-sources-managing.md)。

# 省略外部 Hive 元存储查询中的目录名称
<a name="datastores-hive-default-catalog"></a>

在外部 Hive 元存储上运行 DML 和 DDL 查询时，如果在查询编辑器中选择了目录名称，则可以通过省略该名称来简化查询语法。此功能将受到一些限制。

## DML 语句
<a name="datastores-hive-default-catalog-dml-statements"></a>

**使用已注册目录运行查询**

1. 您可以使用语法 `[[data_source_name].database_name].table_name` 将数据源名称置于数据库之前，如以下示例所示。

   ```
   select * from  "hms-catalog-1".hms_tpch.customer limit 10;
   ```

1. 如果已在查询编辑器中选定要使用的数据源，您可以在查询中省略数据源名称，如以下示例所示。

   ```
   select * from hms_tpch.customer limit 10:
   ```  
![\[使用默认数据源的 DML 查询。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/datastores-hive-default-catalog-2.png)

1. 在查询中使用多个数据源时，只能省略默认数据源名称，并且必须为任何非默认数据源指定全名。

   例如，假设在查询编辑器中将 `AwsDataCatalog` 选作默认数据源。以下查询摘录中的 `FROM` 语句完全限定了前两个数据源名称，但省略了第三个数据源的名称，因为它位于 AWS Glue 数据目录中。

   ```
   ...
   FROM ehms01.hms_tpch.customer,
            "hms-catalog-1".hms_tpch.orders,
            hms_tpch.lineitem
   ...
   ```

## DDL 语句
<a name="datastores-hive-default-catalog-ddl-statements"></a>

以下 Athena DDL 语句支持目录名称前缀。其他 DDL 语句中的目录名称前缀会导致语法错误。

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

SHOW TBLPROPERTIES [[catalog_name.]database_name.]table_name [('property_name')]

SHOW COLUMNS IN [[catalog_name.]database_name.]table_name

SHOW PARTITIONS [[catalog_name.]database_name.]table_name

SHOW CREATE TABLE [[catalog_name.][database_name.]table_name

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

与 DML 语句一样，在查询编辑器中选择了数据源和数据库时，可以省略查询中的数据源和数据库前缀。

在以下示例中，在查询编辑器中选择了 `hms-catalog-1` 数据源和 `hms_tpch` 数据库。即使查询本身中忽略 `hms-catalog-1` 前缀和 `hms_tpch` 数据库名称，`show create table customer` 语句也会成功。

![\[使用默认目录的 DDL 语句。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/datastores-hive-default-catalog-4.png)


## 在 JDBC 连接字符串中指定默认数据源
<a name="datastores-hive-default-catalog-jdbc"></a>

当您使用 Athena JDBC 驱动程序将 Athena 连接到外部 Hive 元存储时，可以使用 `Catalog` 参数在 SQL 编辑器（如 [SQL Workbench](https://www.sql-workbench.eu/index.html)）中的连接字符串中指定默认数据源名称。

**注意**  
要下载最新版本的 Athena JDBC 驱动程序，请参阅[将 Athena 与 JDBC 驱动程序一起使用](https://docs.aws.amazon.com/athena/latest/ug/connect-with-jdbc.html)。

以下连接字符串指定默认数据源 *hms-catalog-name*。

```
    jdbc:awsathena://AwsRegion=us-east-1;S3OutputLocation=s3://amzn-s3-demo-bucket/lambda/results/;Workgroup=AmazonAthenaPreviewFunctionality;Catalog=hms-catalog-name;
```

下图显示了 SQL Workbench 中配置的示例 JDBC 连接 URL。

![\[在 SQL Workbench 中配置 JDBC 连接 URL。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/datastores-hive-default-catalog-jdbc-1.jpg)


# 使用 Hive 视图
<a name="hive-views"></a>

您可以使用 Athena 查询外部 Apache Hive 元存储中的现有视图。Athena 会在运行时实时转换视图，无需更改原始视图或存储翻译。

例如，假设您的 Hive 视图使用了 Athena 中不支持的语法，比如 `LATERAL VIEW explode()`：

```
CREATE VIEW team_view AS 
SELECT team, score 
FROM matches 
LATERAL VIEW explode(scores) m AS score
```

Athena 将 Hive 视图查询字符串转换为 Athena 可以运行的语句，如下所示：

```
SELECT team, score
FROM matches
CROSS JOIN UNNEST(scores) AS m (score)
```

有关将外部 Hive 元存储连接到 Athena 的信息，请参阅 [使用外部 Hive 元存储](connect-to-data-source-hive.md)。

## 注意事项和限制
<a name="hive-views-considerations-and-limitations"></a>

在从 Athena 查询 Hive 视图时，请考虑以下几点：
+ Athena 不支持创建 Hive 视图。您可以在外部 Hive 元存储中创建 Hive 视图，之后可以从 Athena 查询该视图。
+ Athena Hive 视图不支持自定义 UDF。
+ 由于 Athena 控制台中的已知问题，Hive 视图显示在表列表下而不是视图列表下。
+ 尽管转换过程会自动执行，但 Hive 视图不支持某些 Hive 函数或需要特殊处理。有关更多信息，请参阅下文。

## Hive 函数支持限制
<a name="hive-views-function-limitations"></a>

此部分重点介绍了 Athena Hive 视图不支持的或需要特殊处理的 Hive 函数。目前，Athena 主要支持 Hive 2.2.0 的函数，因此不支持只在更高版本（例如 Hive 4.0.0）中可用的函数。有关 Hive 函数的完整列表，请参阅 [Hive 语言手册 UDF](https://cwiki.apache.org/confluence/display/hive/languagemanual+udf)。

### 聚合函数
<a name="hive-views-aggregate-functions"></a>

#### 需要特殊处理的聚合函数
<a name="hive-views-aggregate-functions-special-handling"></a>

以下 Hive 视图的聚合函数需要特殊处理。
+ **Avg** – 请使用 `avg(CAST(i AS DOUBLE))`，而非 `avg(INT i)`。

#### 不支持的聚合函数
<a name="hive-views-aggregate-functions-not-supported"></a>

Athena 的 Hive 视图不支持以下 Hive 聚合函数。

```
covar_pop
histogram_numeric
ntile
percentile
percentile_approx
```

Athena 的 Hive 视图不支持 `regr_count`、`regr_r2` 和 `regr_sxx` 等回归函数。

### 不支持的日期函数
<a name="hive-views-date-functions-not-supported"></a>

Athena 的 Hive 视图不支持以下 Hive 日期函数。

```
date_format(date/timestamp/string ts, string fmt)
day(string date)
dayofmonth(date)
extract(field FROM source)
hour(string date)
minute(string date)
month(string date)
quarter(date/timestamp/string)
second(string date)
weekofyear(string date)
year(string date)
```

### 不支持的掩码函数
<a name="hive-views-masking-functions-not-supported"></a>

Athena 的 Hive 视图不支持 `mask()` 和 `mask_first_n()` 等 Hive 掩码函数。

### 其他函数
<a name="hive-views-miscellaneous-functions"></a>

#### 需要特殊处理的其他函数
<a name="hive-views-supported-miscellaneous-functions-special-handling"></a>

Hive 视图的以下其他函数需要特殊处理。
+ **md5** – Athena 支持 `md5(binary)`，但不支持 `md5(varchar)`。
+ **Explode** – 在以下语法中使用时，Athena 支持 `explode`：

  ```
  LATERAL VIEW [OUTER] EXPLODE(<argument>)
  ```
+ **Posplode**：在以下语法中使用时，Athena 支持 `posexplode`：

  ```
  LATERAL VIEW [OUTER] POSEXPLODE(<argument>)           
  ```

  在 `(pos, val)` 输出中，Athena 将 `pos` 视为 `BIGINT`。因此，您可能需要将 `pos` 转换为 `BIGINT`，防止提供过时视图。以下示例对此方法进行了说明。

  ```
  SELECT CAST(c AS BIGINT) AS c_bigint, d 
  FROM table LATERAL VIEW POSEXPLODE(<argument>) t AS c, d
  ```

#### 不支持的其他函数
<a name="hive-views-unsupported-miscellaneous-functions-not-supported"></a>

Athena 的 Hive 视图不支持以下 Hive 函数。

```
aes_decrypt
aes_encrypt
current_database
current_user
inline
java_method
logged_in_user
reflect
sha/sha1/sha2
stack
version
```

### 运算符
<a name="hive-views-operators"></a>

#### 需要特殊处理的运算符
<a name="hive-views-operators-special-handling"></a>

Hive 视图的以下运算符需要特殊处理。
+ **Mod 运算符 (%)**：因为 `DOUBLE` 类型隐式转换为 `DECIMAL(x,y)`，以下语法可能导致出现 View is stale（视图已过时）错误消息：

  ```
  a_double % 1.0 AS column
  ```

  使用 `CAST` 可解决此问题，如以下示例所示。

  ```
  CAST(a_double % 1.0 as DOUBLE) AS column
  ```
+ **除法运算符 (/)**：在 Hive 中，`int` 除以 `int` 会生成 `double`。在 Athena 中，同样的操作会产生截断 `int`。

#### 不支持的运算符
<a name="hive-views-operators-not-supported"></a>

Athena 的 Hive 视图不支持以下运算符。

**\$1A** – 按位 `NOT`

**A ^ b** – 按位 `XOR`

**A & b** – 按位 `AND`

**A \$1 b** – 按位 `OR`

**A <=> b** – 返回与非空操作数的等于 (`=`) 运算符相同的结果。如果两者都为 `NULL`，则返回 `TRUE`；如果其中一个为 `NULL`，则返回 `FALSE`。

### 字符串函数
<a name="hive-views-string-functions"></a>

#### 需要特殊处理的字符串函数
<a name="hive-views-string-functions-special-handling"></a>

Hive 视图的以下 Hive 字符串函数需要特殊处理。
+ **chr(bigint\$1double a)** – Hive 允许负参数，但 Athena 不允许。
+ **instr(string str, string substr)** – 因为 `instr` 函数的 Athena 映射返回 `BIGINT` 而非 `INT`，所以使用以下语法：

  ```
  CAST(instr(string str, string substr) as INT)         
  ```

  如果不执行此步骤，视图将被视作过时。
+ **length(string a)** – 因为 `length` 函数的 Athena 映射返回 `BIGINT` 而非 `INT`，所以使用以下函数，避免视图被视作过时：

  ```
  CAST(length(string str) as INT)
  ```

#### 不支持的字符串函数
<a name="hive-views-string-functions-not-supported"></a>

Athena 的 Hive 视图不支持以下 Hive 字符串函数。

```
ascii(string str)
character_length(string str)
decode(binary bin, string charset)
encode(string src, string charset)
elt(N int,str1 string,str2 string,str3 string,...)
field(val T,val1 T,val2 T,val3 T,...)
find_in_set(string str, string strList)
initcap(string A)
levenshtein(string A, string B)
locate(string substr, string str[, int pos])
octet_length(string str)
parse_url(string urlString, string partToExtract [, string keyToExtract])
printf(String format, Obj... args)
quote(String text)
regexp_extract(string subject, string pattern, int index)
repeat(string str, int n)
sentences(string str, string lang, string locale)
soundex(string A)
space(int n)
str_to_map(text[, delimiter1, delimiter2])
substring_index(string A, string delim, int count)
```

### 不支持的 xPath 函数
<a name="hive-views-xpath-functions-not-supported"></a>

Athena 的 Hive 视图不支持 `xpath`、`xpath_short` 和 `xpath_int` 等 Hive XPath 函数。

## 问题排查
<a name="hive-views-troubleshooting"></a>

在 Athena 中使用 Hive 视图时，可能遇到以下问题：
+ **视图 *<view name>* 已过时** – 此消息通常表示 Hive 视图与 Athena 视图存在类型不匹配问题。如果 [Hive LanguageManual UDF](https://cwiki.apache.org/confluence/display/hive/languagemanual+udf) 以及 [Presto 函数和运算符](https://prestodb.io/docs/current/functions.html)文档中的相同函数具有不同签名，请尝试强制转换不匹配的数据类型。
+ **函数未注册**：Athena 目前不支持此函数。有关更多信息，请参阅本文档前面所述的信息。

# 将 AWS CLI 与 Hive 元存储结合使用
<a name="datastores-hive-cli"></a>

您可以使用 `aws athena` CLI 命令管理与 Athena 结合使用的 Hive 元数据仓数据目录。在定义一个或多个要与 Athena 结合使用的目录后，可以在 `aws athena` DDL 和 DML 命令中引用这些目录。

## 使用 AWS CLI 管理 Hive 元存储目录
<a name="datastores-hive-cli-manage-hive-catalogs"></a>

### 注册目录：Create-data-catalog
<a name="datastores-hive-cli-registering-a-catalog"></a>

要注册数据目录，请使用 `create-data-catalog` 命令。使用 `name` 参数指定要用于目录的名称。将 Lambda 函数的 ARN 传递到 `parameters` 参数的 `metadata-function` 选项。要为新目录创建标签，请将 `tags` 参数与一个或多个用空格分隔的 `Key=key,Value=value` 参数对结合使用。

以下示例注册名为 `hms-catalog-1` 的 Hive 元存储目录。该命令设置了格式以便于阅读。

```
$ aws athena create-data-catalog 
 --name "hms-catalog-1" 
 --type "HIVE"
 --description "Hive Catalog 1"
 --parameters "metadata-function=arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-v3,sdk-version=1.0" 
 --tags Key=MyKey,Value=MyValue
 --region us-east-1
```

### 显示目录详细信息：Get-data-catalog
<a name="datastores-hive-cli-showing-details-of-a-catalog"></a>

要显示目录的详细信息，请将目录的名称传递到 `get-data-catalog` 命令，如以下示例所示。

```
$ aws athena get-data-catalog --name "hms-catalog-1" --region us-east-1
```

以下示例结果采用 JSON 格式。

```
{
    "DataCatalog": {
        "Name": "hms-catalog-1",
        "Description": "Hive Catalog 1",
        "Type": "HIVE",
        "Parameters": {
            "metadata-function": "arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-v3",
            "sdk-version": "1.0"
        }
    }
}
```

### 列出已注册的目录：List-data-catalogs
<a name="datastores-hive-cli-listing-registered-catalogs"></a>

要列出已注册的目录，请使用 `list-data-catalogs` 命令并选择性地指定一个区域，如以下示例所示。列出的目录始终包含 AWS Glue。

```
$ aws athena list-data-catalogs --region us-east-1
```

以下示例结果采用 JSON 格式。

```
{
    "DataCatalogs": [
        {
            "CatalogName": "AwsDataCatalog",
            "Type": "GLUE"
        },
        {
            "CatalogName": "hms-catalog-1",
            "Type": "HIVE",
            "Parameters": {
                "metadata-function": "arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-v3",
                "sdk-version": "1.0"
            }
        }
    ]
}
```

### 更新目录：Update-data-catalog
<a name="datastores-hive-cli-updating-a-catalog"></a>

要更新数据目录，请使用 `update-data-catalog` 命令，如以下示例所示。该命令设置了格式以便于阅读。

```
$ aws athena update-data-catalog 
 --name "hms-catalog-1" 
 --type "HIVE"
 --description "My New Hive Catalog Description" 
 --parameters "metadata-function=arn:aws:lambda:us-east-1:111122223333:function:external-hms-service-new,sdk-version=1.0" 
 --region us-east-1
```

### 删除目录：Delete-data-catalog
<a name="datastores-hive-cli-deleting-a-catalog"></a>

要删除数据目录，请使用 `delete-data-catalog` 命令，如以下示例所示。

```
$ aws athena delete-data-catalog --name "hms-catalog-1" --region us-east-1
```

### 显示数据库详细信息：Get-database
<a name="datastores-hive-cli-showing-details-of-a-database"></a>

要显示数据库的详细信息，请将目录名称和数据库名称传递到 `get-database` 命令，如以下示例所示。

```
$ aws athena get-database --catalog-name hms-catalog-1 --database-name mydb
```

以下示例结果采用 JSON 格式。

```
{
    "Database": {
        "Name": "mydb",
        "Description": "My database",
        "Parameters": {
            "CreatedBy": "Athena",
            "EXTERNAL": "TRUE"
        }
    }
}
```

### 在目录中列出数据库：List-databases
<a name="datastores-hive-cli-listing-databases"></a>

要在目录中列出数据库，请使用 `list-databases` 命令并选择性地指定一个区域，如以下示例所示。

```
$ aws athena list-databases --catalog-name AwsDataCatalog --region us-west-2
```

以下示例结果采用 JSON 格式。

```
{
    "DatabaseList": [
        {
            "Name": "default"
        },
        {
            "Name": "mycrawlerdatabase"
        },
        {
            "Name": "mydatabase"
        },
        {
            "Name": "sampledb",
            "Description": "Sample database",
            "Parameters": {
                "CreatedBy": "Athena",
                "EXTERNAL": "TRUE"
            }
        },
        {
            "Name": "tpch100"
        }
    ]
}
```

### 显示表详细信息：Get-table-metadata
<a name="datastores-hive-cli-showing-details-of-a-table"></a>

要显示表的元数据（包括列名和数据类型），请将目录名称、数据库名称和表名称传递到 `get-table-metadata` 命令，如以下示例所示。

```
$ aws athena get-table-metadata --catalog-name AwsDataCatalog --database-name mydb --table-name cityuseragent
```

以下示例结果采用 JSON 格式。

```
{
    "TableMetadata": {
        "Name": "cityuseragent",
            "CreateTime": 1586451276.0,
            "LastAccessTime": 0.0,
            "TableType": "EXTERNAL_TABLE",
            "Columns": [
                {
                    "Name": "city",
                    "Type": "string"
                },
                {
                    "Name": "useragent1",
                    "Type": "string"
                }
            ],
            "PartitionKeys": [],
            "Parameters": {
                "COLUMN_STATS_ACCURATE": "false",
                "EXTERNAL": "TRUE",
                "inputformat": "org.apache.hadoop.mapred.TextInputFormat",
                "last_modified_by": "hadoop",
                "last_modified_time": "1586454879",
                "location": "s3://amzn-s3-demo-bucket/",
                "numFiles": "1",
                "numRows": "-1",
                "outputformat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
                "rawDataSize": "-1",
                "serde.param.serialization.format": "1",
                "serde.serialization.lib": "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe",
                "totalSize": "61"
            }
        }
}
```

### 显示数据库中所有表的元数据：List-table-metadata
<a name="datastores-hive-cli-showing-all-table-metadata"></a>

要显示数据库中所有表的元数据，请将目录名称和数据库名称传递到 `list-table-metadata` 命令。`list-table-metadata` 命令与 `get-table-metadata` 命令类似，只是未指定表名。要限制结果的数量，您可以使用 `--max-results` 选项，如以下示例所示。

```
$ aws athena list-table-metadata --catalog-name AwsDataCatalog --database-name sampledb --region us-east-1 --max-results 2
```

以下示例结果采用 JSON 格式。

```
{
    "TableMetadataList": [
        {
            "Name": "cityuseragent",
            "CreateTime": 1586451276.0,
            "LastAccessTime": 0.0,
            "TableType": "EXTERNAL_TABLE",
            "Columns": [
                {
                    "Name": "city",
                    "Type": "string"
                },
                {
                    "Name": "useragent1",
                    "Type": "string"
                }
            ],
            "PartitionKeys": [],
            "Parameters": {
                "COLUMN_STATS_ACCURATE": "false",
                "EXTERNAL": "TRUE",
                "inputformat": "org.apache.hadoop.mapred.TextInputFormat",
                "last_modified_by": "hadoop",
                "last_modified_time": "1586454879",
                "location": "s3://amzn-s3-demo-bucket/",
                "numFiles": "1",
                "numRows": "-1",
                "outputformat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
                "rawDataSize": "-1",
                "serde.param.serialization.format": "1",
                "serde.serialization.lib": "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe",
                "totalSize": "61"
            }
        },
        {
            "Name": "clearinghouse_data",
            "CreateTime": 1589255544.0,
            "LastAccessTime": 0.0,
            "TableType": "EXTERNAL_TABLE",
            "Columns": [
                {
                    "Name": "location",
                    "Type": "string"
                },
                {
                    "Name": "stock_count",
                    "Type": "int"
                },
                {
                    "Name": "quantity_shipped",
                    "Type": "int"
                }
            ],
            "PartitionKeys": [],
            "Parameters": {
                "EXTERNAL": "TRUE",
                "inputformat": "org.apache.hadoop.mapred.TextInputFormat",
                "location": "s3://amzn-s3-demo-bucket/",
                "outputformat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat",
                "serde.param.serialization.format": "1",
                "serde.serialization.lib": "org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe",
                "transient_lastDdlTime": "1589255544"
            }
        }
    ],
    "NextToken": "eyJsYXN0RXZhbHVhdGVkS2V5Ijp7IkhBU0hfS0VZIjp7InMiOiJ0Ljk0YWZjYjk1MjJjNTQ1YmU4Y2I5OWE5NTg0MjFjYTYzIn0sIlJBTkdFX0tFWSI6eyJzIjoiY2xlYXJpbmdob3VzZV9kYXRhIn19LCJleHBpcmF0aW9uIjp7InNlY29uZHMiOjE1ODkzNDIwMjIsIm5hbm9zIjo2NTUwMDAwMDB9fQ=="
}
```

## 运行 DDL 和 DML 语句
<a name="datastores-hive-cli-running-ddl-and-dml"></a>

在使用 AWS CLI 运行 DDL 和 DML 语句时，您可以通过两种方式之一传递 Hive 元存储目录的名称：
+ 直接传入支持它的语句。
+ 传递到 `--query-execution-context` `Catalog` 参数。

### DDL 语句
<a name="datastores-hive-cli-ddl-statements"></a>

以下示例将目录名称作为 `show create table` DDL 语句的一部分直接传入。该命令设置了格式以便于阅读。

```
$ aws athena start-query-execution 
 --query-string "show create table hms-catalog-1.hms_tpch_partitioned.lineitem" 
 --result-configuration "OutputLocation=s3://amzn-s3-demo-bucket/lambda/results"
```

以下示例 DDL `show create table` 语句使用 `--query-execution-context` 的 `Catalog` 参数传递 Hive 元存储目录名称 `hms-catalog-1`。该命令设置了格式以便于阅读。

```
$ aws athena start-query-execution 
 --query-string "show create table lineitem" 
 --query-execution-context "Catalog=hms-catalog-1,Database=hms_tpch_partitioned" 
 --result-configuration "OutputLocation=s3://amzn-s3-demo-bucket/lambda/results"
```

### DML 语句
<a name="datastores-hive-cli-dml-statements"></a>

以下示例 DML `select` 语句将目录名称直接传入查询。该命令设置了格式以便于阅读。

```
$ aws athena start-query-execution
 --query-string "select * from hms-catalog-1.hms_tpch_partitioned.customer limit 100" 
 --result-configuration "OutputLocation=s3://amzn-s3-demo-bucket/lambda/results"
```

以下示例 DML `select` 语句使用 `--query-execution-context` 的 `Catalog` 参数传入 Hive 元存储目录名称 `hms-catalog-1`。该命令设置了格式以便于阅读。

```
$ aws athena start-query-execution 
 --query-string "select * from customer limit 100" 
 --query-execution-context "Catalog=hms-catalog-1,Database=hms_tpch_partitioned" 
 --result-configuration "OutputLocation=s3://amzn-s3-demo-bucket/lambda/results"
```

# 修改 Athena 外部 Hive 元存储连接器
<a name="datastores-hive-reference-implementation"></a>

如果您有特殊要求，则可以修改外部 Hive 元存储的 Athena 连接器以供自己使用。Athena 为 GitHub.com（网址为 [https://github.com/awslabs/aws-athena-hive-metastore](https://github.com/awslabs/aws-athena-hive-metastore)）上的连接器提供参考实现。在大多数使用案例中，无需修改参考实施。但是，如有必要，您可以修改源代码并自行构建构件。

参考实施是一个具有以下模块的 [Apache Maven](https://maven.apache.org/) 项目：
+ `hms-service-api` – 包含 Lambda 函数和 Athena 服务客户端之间的 API 操作。这些 API 操作是在 `HiveMetaStoreService` 接口中定义的。由于这是一个服务合同，因此，您不应更改此模块中的任何内容。
+ `hms-lambda-handler` – 一组默认 Lambda 处理程序，用于处理所有 Hive 元数据仓 API 调用。类 `MetadataHandler` 是用于所有 API 调用的调度程序。您无需更改此程序包。
+ `hms-lambda-func` – 一个具有以下组件的示例 Lambda 函数。
  + `HiveMetaStoreLambdaFunc` – 一个扩展 `MetadataHandler` 的示例 Lambda 函数。
  + `ThriftHiveMetaStoreClient` – 一个与 Hive 元存储进行通信的 Thrift 客户端。此客户端是针对 Hive 2.3.0 编写的。如果您使用其他 Hive 版本，则可能需要更新此类以确保响应对象可兼容。
  + `ThriftHiveMetaStoreClientFactory` – 控制 Lambda 函数的行为。例如，您可以通过覆盖 `getHandlerProvider()` 方法来提供自己的一组处理程序提供程序。
  + `hms.properties` – 配置 Lambda 函数。在大多数情况下，只需更新以下两个属性。
    + `hive.metastore.uris` – 格式为 `thrift://<host_name>:9083` 的 Hive 元存储 URI。
    + `hive.metastore.response.spill.location`：当响应对象的大小超过给定阈值（例如 4 MB）时，用于存储响应对象的 Amazon S3 位置。阈值是在属性 `hive.metastore.response.spill.threshold` 中定义的。建议不要更改默认值。
**注意**  
这两个属性可以由 [Lambda 环境变量](https://docs.aws.amazon.com/lambda/latest/dg/env_variables.html) `HMS_URIS` 和 `SPILL_LOCATION` 覆盖。当您希望将 Lambda 函数用于不同的 Hive 元数据仓或溢出位置时，请使用这些变量而不是重新编译该函数的源代码。
+ `hms-lambda-layer` – 一个 Maven 程序集项目，用于将 `hms-service-api`、`hms-lambda-handler` 及其依赖关系放入一个 `.zip` 文件中。此 `.zip` 文件将注册为 Lambda 层以供多个 Lambda 函数使用。
+ `hms-lambda-rnp` – 记录来自 Lambda 函数的响应，然后将其用于重播响应。您可以使用此模型来模拟 Lambda 响应以进行测试。

## 自行构建构件
<a name="datastores-hive-reference-implementation-building-the-artifacts-yourself"></a>

修改源代码后，您可以自行构建构件并将其上载到 Amazon S3 位置。

在构建构件之前，请更新 `hms-lambda-func` 模块中 `hms.properties` 文件中的属性 `hive.metastore.uris` 和 `hive.metastore.response.spill.location`。

要构建构件，您必须已安装 Apache Maven 并运行命令 `mvn install`。这将在模块 `hms-lambda-layer` 中的名为 `target` 的输出文件夹中生成层 `.zip` 文件，并在模块 `hms-lambd-func` 中生成 Lambda 函数 `.jar` 文件。