

# Usar um metastore externa do Hive
<a name="connect-to-data-source-hive"></a>

Você pode usar o conector de dados do Amazon Athena para o metastore externo do Hive para consultar conjuntos de dados no Amazon S3 que usam um metastore do Apache Hive. Não é necessária nenhuma migração de metadados para o AWS Glue Data Catalog. No console de gerenciamento do Athena, configure uma função do Lambda para se comunicar com o metastore do Hive que está em sua VPC privada e conectá-la ao metastore. A conexão do Lambda com o metastore do Hive é protegida por um canal privado do Amazon VPC e não usa a Internet pública. Você pode usar seu próprio código de função do Lambda ou a implementação padrão do conector de dados do Athena para o metastore externo do Hive.

**Topics**
+ [Visão geral de recursos](#connect-to-a-data-source-hive-features)
+ [Fluxo de trabalho](#connect-to-data-source-hive-workflow)
+ [Considerações e limitações](#connect-to-a-data-source-hive-considerations)
+ [Conectar o Athena a um metastore do Apache Hive](connect-to-data-source-hive-connecting-athena-to-an-apache-hive-metastore.md)
+ [Usar o AWS Serverless Application Repository para implementar um conector de fonte de dados do Hive](connect-data-source-sar-hive.md)
+ [Conectar o Athena a um metastore do Hive com uso de um perfil de execução do IAM existente](connect-data-source-hive-existing-iam-role.md)
+ [Configurar o Athena para usar um conector de metastore do Hive implantado](connect-data-source-hive-existing-lambda.md)
+ [Omitir o nome do catálogo em consultas do metastore externo do Hive](datastores-hive-default-catalog.md)
+ [Trabalhar com visualizações do Hive](hive-views.md)
+ [Usar a AWS CLI com metastores do Hive](datastores-hive-cli.md)
+ [Modificar o conector externo do Hive metastore do Athena](datastores-hive-reference-implementation.md)

## Visão geral de recursos
<a name="connect-to-a-data-source-hive-features"></a>

Com o conector de dados do Athena para metastore externo do Hive, você pode executar as seguintes tarefas:
+ Use o console do Athena para registrar catálogos personalizados e usá-los para executar consultas.
+ Defina funções do Lambda para diferentes metastores externos do Hive e adicione-as às consultas do Athena.
+ Use o AWS Glue Data Catalog e os metastores externos do Hive na mesma consulta do Athena.
+ Especifique um catálogo no contexto de execução da consulta como o catálogo padrão atual. Isso remove a necessidade de prefixar nomes de catálogo para nomes de banco de dados em suas consultas. Em vez de usar a sintaxe `catalog.database.table`, você pode usar `database.table`.
+ Use uma variedade de ferramentas para executar consultas que fazem referência a metastores externos do Hive. Você pode usar o console do Athena, a AWS CLI, o AWS SDK, as APIs do Athena e os drivers JDBC e ODBC atualizados do Athena. Os drivers atualizados são compatíveis com catálogos personalizados.

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

O conector de dados do Athena para metastore externo do Hive permite operações da API de registro de catálogo e da API de metadados.
+ **Registro do catálogo**: registre catálogos personalizados para metastores externos do Hive e [origens de dados federadas](federated-queries.md). 
+ **Metadados**: use as APIs de metadados para fornecer informações de banco de dados e tabela para o AWS Glue e qualquer catálogo que você registrar no Athena.
+ **Cliente JAVA SDK do Athena**: use as APIs de registro de catálogo, as APIs de metadados e o suporte para catálogos na operação `StartQueryExecution` no cliente Java SDK atualizado do Athena.

### Implementação de referência
<a name="connect-to-a-data-source-hive-features-reference-implementation"></a>

O Athena oferece uma implementação de referência para a função do Lambda que se conecta a metastores externos do Hive. A implementação de referência é fornecida no GitHub como um projeto de código aberto no [metastore do Athena Hive](https://github.com/awslabs/aws-athena-hive-metastore).

A implementação de referência está disponível como os dois aplicativos do AWS SAM a seguir no AWS Serverless Application Repository (SAR). Você pode usar qualquer uma dessas aplicações no SAR para criar as próprias funções do Lambda.
+ `AthenaHiveMetastoreFunction`: arquivo Uber `.jar` da função do Lambda. Um "uber" JAR (também conhecido como fat JAR ou JAR com dependências) é um arquivo `.jar` com um programa Java e as respectivas dependências em um único arquivo. 
+ `AthenaHiveMetastoreFunctionWithLayer`: a camada do Lambda e o arquivo `.jar` fino da função do Lambda.

## Fluxo de trabalho
<a name="connect-to-data-source-hive-workflow"></a>

O diagrama a seguir mostra como o Athena interage com o metastore externo do Hive.

![\[Como o Athena interage com o metastore externo do Hive.\]](http://docs.aws.amazon.com/pt_br/athena/latest/ug/images/connect-to-data-source-hive-workflow.png)


Neste fluxo de trabalho, o metastore do Hive conectado ao banco de dados está dentro da sua VPC. Você usa o Hive Server2 para gerenciar sua metastore do Hive usando a CLI do Hive.

O fluxo de trabalho para uso de metastores externos do Hive do Athena inclui as etapas a seguir.

1. Crie uma função do Lambda que conecte o Athena ao metastore do Hive que reside em sua VPC.

1. Registre um nome de catálogo exclusivo para seu metastore do Hive e um nome de função correspondente em sua conta.

1. Ao executar uma consulta DML ou DDL do Athena que usa o nome do catálogo, o mecanismo de consulta do Athena chama o nome da função do Lambda que você associou ao nome do catálogo.

1. Ao usar AWS PrivateLink, a função do Lambda se comunica com o metastore externo do Hive em sua VPC e recebe respostas às solicitações de metadados. O Athena usa os metadados do metastore externo do Hive da mesma forma que usa os metadados do padrão AWS Glue Data Catalog.

## Considerações e limitações
<a name="connect-to-a-data-source-hive-considerations"></a>

Ao usar o conector de dados do Athena para metastore externo do Hive, considere os seguintes pontos:
+ É possível usar CTAS para criar uma tabela em um metastore do Hive externo.
+ É possível usar INSERT INTO para inserir dados em um metastore do Hive externo.
+ O suporte de DDL para metastore externo do Hive está limitado às instruções a seguir.
  + 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
  + CRIAR TABELA
  + CREATE TABLE AS
  + DESCRIBE TABLE
  + DROP DATABASE
  + DESCARTAR TABELA
  + SHOW COLUMNS
  + SHOW CREATE TABLE
  + SHOW PARTITIONS
  + SHOW SCHEMAS
  + SHOW TABLES
  + SHOW TBLPROPERTIES
+ O número máximo de catálogos registrados que é possível ter é 1.000.
+ A autenticação Kerberos para o metastore do Hive não é compatível.
+ Para usar o driver JDBC com um metastore externo do Hive ou com [consultas federadas](federated-queries.md), inclua`MetadataRetrievalMethod=ProxyAPI` na string de conexão do JDBC. Para obter informações sobre o driver JDBC, consulte [Conectar ao Amazon Athena com JDBC](connect-with-jdbc.md).
+ As colunas ocultas do Hive `$path`, `$bucket`, `$file_size`, `$file_modified_time`, `$partition` e `$row_id` não podem ser usadas para filtragem de controle de acesso detalhada. 
+ Não há suporte para o controle de acesso detalhado para tabelas de sistema ocultas do Hive, como `example_table$partitions` ou `example_table$properties`.

### Permissões
<a name="connect-to-a-data-source-hive-considerations-permissions"></a>

Conectores de dados predefinidos e personalizados podem exigir acesso aos recursos a seguir para funcionar corretamente. Verifique as informações do conector que você usa para confirmar se você configurou a VPC corretamente. Para obter informações sobre as permissões do IAM necessárias para executar consultas e criar um conector de origem dos dados no Athena, consulte [Permitir a um metastore do Hive externo acesso a um conector de dados do Athena](hive-metastore-iam-access.md) e [Permitir acesso da função do Lambda aos metastores externos do Hive](hive-metastore-iam-access-lambda.md).
+ **Amazon S3**: além de gravar os resultados das consultas no local específico do Athena no Amazon S3, os conectores de dados gravam em um bucket de vazamento no Amazon S3. São necessárias conectividade e permissões para esse local do Amazon S3. Para obter mais informações, consulte [Local de vazamento no Amazon S3](#connect-to-data-source-hive-spill-location) mais adiante neste tópico.
+ **Athena**: o acesso é necessário para conferir o status da consulta e evitar verificação em excesso.
+ **AWS Glue**: o acesso será necessário se o conector usar AWS Glue para metadados complementares ou primários.
+ **AWS Key Management Service**
+ **Políticas**: o metastore do Hive, o Athena Query Federation e as UDFs exigem políticas além da [AWSPolítica gerenciada pela : AmazonAthenaFullAccess](security-iam-awsmanpol.md#amazonathenafullaccess-managed-policy). Para obter mais informações, consulte [Gerenciamento de identidade e acesso no Athena](security-iam-athena.md).

### Local de vazamento no Amazon S3
<a name="connect-to-data-source-hive-spill-location"></a>

Devido ao [limite](https://docs.aws.amazon.com/lambda/latest/dg/limits.html) de tamanho de resposta da função do Lambda, as respostas que o ultrapassam são vazadas para um local no Amazon S3 especificado quando você cria a função do Lambda. O Athena lê essas respostas diretamente do Amazon S3. 

**nota**  
O Athena não remove os arquivos de resposta do Amazon S3. Recomendamos configurar uma política de retenção para excluir arquivos de resposta automaticamente. 

# Conectar o Athena a um metastore do Apache Hive
<a name="connect-to-data-source-hive-connecting-athena-to-an-apache-hive-metastore"></a>

Para conectar o Athena a um metastore do Apache Hive, crie e configure uma função do Lambda. Para uma implementação básica, execute todas as etapas necessárias no console de gerenciamento do Athena.

**nota**  
O procedimento a seguir requer que você tenha permissão para criar uma função personalizada do IAM para a função do Lambda. Se você não tiver permissão para criar uma função personalizada, poderá usar a [implementação de referência](connect-to-data-source-hive.md#connect-to-a-data-source-hive-features-reference-implementation) do Athena para criar uma função do Lambda separadamente e, depois, usar o console do AWS Lambda para escolher uma função existente do IAM para essa função. Para obter mais informações, consulte [Conectar o Athena a um metastore do Hive com uso de um perfil de execução do IAM existente](connect-data-source-hive-existing-iam-role.md).

**Para conectar o Athena a um metastore do Hive**

1. Abra o console do Athena em [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home).

1. Se o painel de navegação do console não estiver visível, escolha o menu de expansão à esquerda.  
![\[Escolha o menu de expansão.\]](http://docs.aws.amazon.com/pt_br/athena/latest/ug/images/nav-pane-expansion.png)

1. Escolha **Fontes de dados e catálogos**.

1. No canto superior direito do console, escolha **Create data source** (Criar origem dos dados).

1. Na página **Choose a data source** (Escolher uma origem dos dados), em **Data sources** (Origens de dados), escolha **S3 - Apache Hive metastore**.

1. Escolha **Próximo**.

1. Na seção **Data source details** (Detalhes da origem dos dados), em **Data source name** (Nome da origem dos dados), insira o nome que deseja usar em suas instruções SQL ao consultar a origem dos dados pelo Athena. O nome pode ter até 127 caracteres e deve ser exclusivo na sua conta. Ele não poderá ser alterado após a criação. Os caracteres válidos são a-z, A-Z, 0-9, \$1 (sublinhado), @ (arroba) e - (hífen). Os nomes `awsdatacatalog`, `hive`, `jmx` e `system` são reservados pelo Athena e não podem ser usados como nomes de origens dos dados. 

1. Em ‭**Função do Lambda**, escolha **Criar função do Lambda** e, em seguida, **Criar uma nova função do Lambda no AWS Lambda**

   A página **AthenaHiveMetastoreFunction** é aberta no console do AWS Lambda. A página inclui informações detalhadas sobre o conector.  
![\[A página AthenaHiveMetastoreFunction no console do AWS Lambda.\]](http://docs.aws.amazon.com/pt_br/athena/latest/ug/images/connect-to-data-source-hive-4.png)

1. Em **Application settings** (Configurações da aplicação), insira os parâmetros para a função do Lambda.
   + **LambdaFuncName**: especifique um nome para a função. Por exemplo, **myHiveMetastore**.
   + **SpillLocation**: especifique um local do Amazon S3 nessa conta para armazenar os metadados de vazamento, caso o tamanho da resposta da função do Lambda exceda 4 MB.
   + **HMSUris**: insira o URI do host do metastore do Hive que usa o protocolo Thrift na porta 9083. Use a sintaxe `thrift://<host_name>:9083`.
   + **LambdaMemory**: especifique um valor entre 128 MB e 3008 MB. A função do Lambda aloca os ciclos de CPU proporcionalmente à quantidade de memória que você configura. O padrão é 1024.
   + **LambdaTimeout**: especifique o tempo máximo de execução de invocação do Lambda permitido em segundos de 1 a 900 (900 segundos são 15 minutos). O padrão é 300 segundos (5 minutos).
   + **VPCSecurityGroupIds**: insira uma lista separada por vírgulas de IDs de grupo de segurança da VPC para o metastore do Hive.
   + **VPCSubnetIds**: insira uma lista separada por vírgulas de IDs de sub-rede da VPC para o metastore do Hive.

1. Selecione **I acknowledge that this app creates custom IAM roles** (Eu reconheço que este aplicativo cria funções personalizadas do IAM e, em seguida, escolha **Deploy** (Implantar).  
![\[Implantar a aplicação de função do Lambda pelo console do AWS Lambda.\]](http://docs.aws.amazon.com/pt_br/athena/latest/ug/images/connect-to-data-source-hive-4a.png)

   Quando a implantação for concluída, sua função será exibida na lista de aplicações do Lambda. Agora que a função do metastore do Hive foi implantada em sua conta, você pode configurar o Athena para usá-la.

1. Retorne à página **Enter data source details** (Inserir detalhes da origem dos dados) do console do Athena.

1. Na seção **Lambda function** (Função do Lambda), escolha o ícone de atualização ao lado da caixa de pesquisa de funções do Lambda. Atualizar a lista de funções disponíveis faz com que a função recém-criada apareça na lista.

1. Escolha o nome da função que você acabou de criar no console do Lambda. O ARN da função do Lambda é exibido.

1. (Opcional) Para **Tags**, adicione pares de chave-valor a associar com essa origem dos dados. Para obter mais informações sobre tags, consulte [Marcar recursos do Athena com tags](tags.md).

1. Escolha **Próximo**.

1. Na página **Review and create** (Revisar e criar), analise os detalhes da origem dos dados e escolha **Create data source** (Criar origem dos dados). 

1. A seção **Data source details** (Detalhes da origem dos dados) da página de sua origem dos dados mostra informações sobre o novo conector. 

   Agora você poderá usar o **Data source name** (Nome da origem dos dados) especificado para fazer referência ao metastore do Hive em suas consultas SQL no Athena. Nas consultas SQL, use a seguinte sintaxe de exemplo, substituindo `hms-catalog-1` pelo nome do catálogo especificado anteriormente.

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

1. Para obter informações sobre como visualizar, editar ou excluir as origens dos dados criadas, consulte [Gerenciar suas fontes de dados](data-sources-managing.md).

# Usar o AWS Serverless Application Repository para implementar um conector de fonte de dados do Hive
<a name="connect-data-source-sar-hive"></a>

Para implantar um conector de origem dos dados do Athena para Hive, você pode usar o [AWS Serverless Application Repository](https://aws.amazon.com/serverless/serverlessrepo/) em vez de começar com o console do Athena. Use AWS Serverless Application Repository para encontrar o conector que deseja usar, forneça os parâmetros que o conector exige e implante o conector em sua conta. Depois de implantar o conector, você usa o console do Athena para disponibilizar a origem dos dados para o Athena.

**Como usar o AWS Serverless Application Repository para implantar um conector de fonte de dados do Hive em sua conta**

1. Faça login no Console de gerenciamento da AWS e abra o **Repositório de aplicativos sem servidor**.

1. No painel de navegação, escolha **Aplicativos disponíveis**.

1. Selecione a opção **Show apps that create custom IAM roles or resource policies** (Mostrar aplicações que criam funções personalizadas do IAM ou políticas de recursos).

1. Na caixa de pesquisa, insira **Hive**. Os conectores exibidos incluem estes dois:
   + **AthenaHiveMetastoreFunction**: arquivo Uber `.jar` da função do Lambda.
   + **AthenaHiveMetastoreFunctionWithLayer**: a camada do Lambda e o arquivo `.jar` fino da função do Lambda.

    Os dois aplicativos têm a mesma funcionalidade e diferem apenas em sua implementação. É possível usar qualquer um para criar uma função do Lambda que conecta o Athena ao seu metastore do Hive.

1. Escolha o nome do conector que você deseja usar. Este tutorial usa **AthenaHiveMetastoreFunction**.  
![\[Escolha o nome do conector de origem dos dados do Athena para Hive.\]](http://docs.aws.amazon.com/pt_br/athena/latest/ug/images/connect-data-source-sar-hive-1.png)

1. Em **Application settings** (Configurações da aplicação), insira os parâmetros para a função do Lambda.
   + **LambdaFuncName**: especifique um nome para a função. Por exemplo, **myHiveMetastore**.
   + **SpillLocation**: especifique um local do Amazon S3 nessa conta para armazenar os metadados de vazamento, caso o tamanho da resposta da função do Lambda exceda 4 MB.
   + **HMSUris**: insira o URI do host do metastore do Hive que usa o protocolo Thrift na porta 9083. Use a sintaxe `thrift://<host_name>:9083`.
   + **LambdaMemory**: especifique um valor entre 128 MB e 3008 MB. A função do Lambda aloca os ciclos de CPU proporcionalmente à quantidade de memória que você configura. O padrão é 1024.
   + **LambdaTimeout**: especifique o tempo máximo de execução de invocação do Lambda permitido em segundos de 1 a 900 (900 segundos são 15 minutos). O padrão é 300 segundos (5 minutos).
   + **VPCSecurityGroupIds**: insira uma lista separada por vírgulas de IDs de grupo de segurança da VPC para o metastore do Hive.
   + **VPCSubnetIds**: insira uma lista separada por vírgulas de IDs de sub-rede da VPC para o metastore do Hive.

1. Na parte inferior direita da página **Application details** (Detalhes da aplicação), selecione **I acknowledge that this app creates custom IAM roles** (Eu reconheço que esta aplicação cria funções personalizadas do IAM) e escolha **Deploy** (Implantar).

Neste ponto, você pode configurar o Athena para usar sua função do Lambda para se conectar ao metastore do Hive. Para obter as etapas, consulte [Configurar o Athena para usar um conector de metastore do Hive implantado](connect-data-source-hive-existing-lambda.md).

# Conectar o Athena a um metastore do Hive com uso de um perfil de execução do IAM existente
<a name="connect-data-source-hive-existing-iam-role"></a>

Para conectar seu metastore externo do Hive ao Athena com uma função do Lambda que usa uma função do IAM existente, você pode usar a implementação de referência do Athena do conector Athena para o metastore externo do Hive.

Veja abaixo as três etapas principais:

1. **[Clonar e criar](#connect-data-source-hive-existing-iam-role-clone-and-build-the-lambda-function)**: clone a implementação de referência do Athena e crie o arquivo JAR que contém o código da função do Lambda.

1. **[Console do AWS Lambda](#connect-data-source-hive-existing-iam-role-aws-lambda-console)**: no console do AWS Lambda, crie uma função do Lambda, atribua a ela uma função de execução do IAM existente e carregue o código da função que você gerou.

1. **[Console do Amazon Athena](connect-data-source-hive-existing-lambda.md)**: no console do Amazon Athena, crie um nome da origem dos dados que você pode usar para referenciar o metastore externo do Hive em suas consultas do Athena.

Se você já tiver permissões para criar uma função personalizada do IAM, poderá usar um fluxo de trabalho mais simples que use o console do Athena e o AWS Serverless Application Repository para criar e configurar uma função do Lambda. Para obter mais informações, consulte [Conectar o Athena a um metastore do Apache Hive](connect-to-data-source-hive-connecting-athena-to-an-apache-hive-metastore.md).

## Pré-requisitos
<a name="connect-data-source-hive-existing-iam-role-prerequisites"></a>
+ O Git deve estar instalado no sistema.
+ Você deve ter o [Apache Maven](https://maven.apache.org/) instalado.
+ Você tem uma função de execução do IAM que pode atribuir à função do Lambda. Para obter mais informações, consulte [Permitir acesso da função do Lambda aos metastores externos do Hive](hive-metastore-iam-access-lambda.md).

## Clonar e criar a função do Lambda
<a name="connect-data-source-hive-existing-iam-role-clone-and-build-the-lambda-function"></a>

O código da função para a implementação de referência do Athena é um projeto do Maven localizado no GitHub em [awslabs/aws-athena-hive-metastore](https://github.com/awslabs/aws-athena-hive-metastore). Para obter informações detalhadas sobre o projeto, consulte o arquivo README correspondente no GitHub ou o tópico [Modificar o conector externo do Hive metastore do Athena](datastores-hive-reference-implementation.md) nesta documentação.

**Para clonar e criar o código da função do Lambda**

1. Insira o seguinte comando para clonar a implementação de referência do Athena:

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

1. Execute este comando para criar o arquivo `.jar` para a função do Lambda:

   ```
   mvn clean install
   ```

   Após a compilação bem-sucedida do projeto, o seguinte arquivo `.jar` será criado na pasta de destino do projeto:

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

   Na próxima seção, use o console do AWS Lambda para carregar esse arquivo em sua conta da Amazon Web Services.

## Criar e configurar a função do Lambda no console do AWS Lambda
<a name="connect-data-source-hive-existing-iam-role-aws-lambda-console"></a>

Nesta seção, use o console do AWS Lambda para criar uma função que aplique uma função de execução do IAM existente. Depois de configurar uma VPC para a função, carregue o código da função e configure as variáveis de ambiente dela.

### Criar a função do Lambda
<a name="connect-data-source-hive-existing-iam-role-create-the-lambda-function"></a>

Nesta etapa, crie uma função no console do AWS Lambda que use uma função do IAM existente.

**Para criar uma função do Lambda que usa uma função do IAM existente**

1. Faça login no Console de gerenciamento da AWS e abra o console do AWS Lambda em [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).

1. Selecione **Funções** no painel de navegação.

1. Escolha **Create function** (Criar função).

1. Escolha **Author from scratch** (Criar do zero).

1. Em **Function name** (Nome da função), insira o nome da sua função do Lambda (por exemplo, **EHMSBasedLambda**).

1. Em **Runtime** (Tempo de execução), escolha **Java 8**.

1. Em **Permissions** (Permissões), expanda **Change default execution role** (Alterar função de execução padrão).

1. Para **Execution role (Função de execução)**, selecione **Use an existing role (Usar uma função existente)**.

1. Em **Existing role** (Função existente), escolha a função de execução do IAM que sua função do Lambda usará com o Athena (este exemplo usa uma função chamada `AthenaLambdaExecutionRole`).

1. Expanda **Advanced settings (Configurações avançadas)**.

1. Selecione **Enable Network** (Habilitar rede).

1. Em **VPC**, escolha a VPC à qual sua função terá acesso.

1. Em **Subnets** (Sub-redes), escolha as sub-redes VPC para o Lambda usar.

1. Em **Security groups** (Grupos de segurança), escolha os grupos de segurança da VPC para o Lambda usar.

1. Escolha a opção **Criar função**. O console do AWS Lambda abre a página de configuração da sua função e começa a criá-la.

### Carregar o código e configurar a função do Lambda
<a name="connect-data-source-hive-existing-iam-role-upload-and-configure"></a>

Quando o console informar que sua função foi criada com êxito, você estará pronto para carregar o código da função e configurar as variáveis de ambiente.

**Para carregar o código da função do Lambda e configurar as variáveis de ambiente**

1. No console do Lambda, certifique-se de que você está na guia **Code** (Código) da página da função que você especificou.

1. Em **Code source** (Fonte do código), escolha **Upload from** (Carregar de) e escolha **.zip or jar file** (Arquivo .zip ou .jar).

1. Carregue o arquivo `hms-lambda-func-1.0-SNAPSHOT-withdep.jar` que você gerou.

1. Em sua página da função Lambda, escolha a guia **Configuration** (Configuração).

1. No painel à esquerda, escolha **Environment variables** (Variáveis de ambiente).

1. Em **Variáveis de ambiente**, selecione **Editar**.  
![\[Escolha Edit para editar as variáveis de ambiente da função do Lambda.\]](http://docs.aws.amazon.com/pt_br/athena/latest/ug/images/connect-data-source-hive-existing-iam-role-5.png)

1. Na página **Edit environment variables** (Editar variáveis de ambiente), use a opção **Add environment variable** (Adicionar variável de ambiente) para adicionar as seguintes chaves e valores da variável de ambiente:
   + **HMS\$1URIS**: use a sintaxe a seguir para inserir o URI do host do metastore do Hive que usa o protocolo Thrift na porta 9083.

     ```
     thrift://<host_name>:9083
     ```
   + **SPILL\$1LOCATION**: especifique um local do Amazon S3 na sua conta da Amazon Web Services para armazenar os metadados de vazamento, caso o tamanho da resposta da função do Lambda exceda 4 MB.  
![\[Especificar valores para as variáveis de ambiente da função do Lambda.\]](http://docs.aws.amazon.com/pt_br/athena/latest/ug/images/connect-data-source-hive-existing-iam-role-6.png)

1. Escolha **Salvar**.

Neste ponto, você está pronto para configurar o Athena para usar sua função do Lambda para se conectar ao metastore do Hive. Para obter as etapas, consulte [Configurar o Athena para usar um conector de metastore do Hive implantado](connect-data-source-hive-existing-lambda.md).

# Configurar o Athena para usar um conector de metastore do Hive implantado
<a name="connect-data-source-hive-existing-lambda"></a>

Depois de implantar um conector de origem dos dados do Lambda em sua conta, como `AthenaHiveMetastoreFunction`, você pode configurar o Athena para usá-lo. Para isso, crie um nome de origem dos dados que faça referência a sua metastore externa do Hive para usar em suas consultas do Athena.

**Para conectar o Athena ao metastore do Hive usando uma função do Lambda existente**

1. Abra o console do Athena em [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home).

1. Se o painel de navegação do console não estiver visível, escolha o menu de expansão à esquerda.  
![\[Escolha o menu de expansão.\]](http://docs.aws.amazon.com/pt_br/athena/latest/ug/images/nav-pane-expansion.png)

1. Escolha **Fontes de dados e catálogos**.

1. Na página **Fontes de dados e catálogos**, escolha **Criar fonte de dados**.

1. Na página **Choose a data source** (Escolher uma origem dos dados), em **Data sources** (Origens de dados), escolha **S3 - Apache Hive metastore**.

1. Escolha **Próximo**.

1. Na seção **Data source details** (Detalhes da origem dos dados), em **Data source name** (Nome da origem dos dados), insira o nome que deseja usar em suas instruções SQL ao consultar a origem dos dados pelo Athena (por exemplo, `MyHiveMetastore`). O nome pode ter até 127 caracteres e deve ser exclusivo na sua conta. Ele não poderá ser alterado após a criação. Os caracteres válidos são a-z, A-Z, 0-9, \$1 (sublinhado), @ (arroba) e - (hífen). Os nomes `awsdatacatalog`, `hive`, `jmx` e `system` são reservados pelo Athena e não podem ser usados como nomes de origens dos dados. 

1. Na seção **Connection details** (Detalhes da conexão), use a caixa **Select or enter a Lambda function** (Selecionar ou inserir uma função do Lambda) para escolher o nome da função que você acabou de criar. O ARN da função do Lambda é exibido.

1. (Opcional) Para **Tags**, adicione pares de chave-valor a associar com essa origem dos dados. Para obter mais informações sobre tags, consulte [Marcar recursos do Athena com tags](tags.md).

1. Escolha **Próximo**.

1. Na página **Review and create** (Revisar e criar), analise os detalhes da origem dos dados e escolha **Create data source** (Criar origem dos dados). 

1. A seção **Data source details** (Detalhes da origem dos dados) da página de sua origem dos dados mostra informações sobre o novo conector.

   Agora você poderá usar o **Data source name** (Nome da origem dos dados) especificado para fazer referência ao metastore do Hive em suas consultas SQL no Athena.

   Nas consultas SQL, use a seguinte sintaxe de exemplo, substituindo `ehms-catalog` pelo nome da origem dos dados especificada anteriormente.

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

1. Para visualizar, editar ou excluir as fontes de dados criadas, consulte [Gerenciar suas fontes de dados](data-sources-managing.md).

# Omitir o nome do catálogo em consultas do metastore externo do Hive
<a name="datastores-hive-default-catalog"></a>

Ao executar consultas DML e DDL em metastores externos do Hive, você pode simplificar a sintaxe da consulta omitindo o nome do catálogo se esse nome estiver selecionado no editor de consulta. Certas restrições se aplicam a essa funcionalidade.

## Instruções DML
<a name="datastores-hive-default-catalog-dml-statements"></a>

**Como executar consultas com catálogos registrados**

1. Você pode colocar o nome da origem dos dados antes do banco de dados usando a sintaxe `[[data_source_name].database_name].table_name`, como no exemplo a seguir.

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

1. Quando a origem dos dados que você deseja usar já estiver selecionada no editor de consultas, você poderá omitir o nome da consulta, como no exemplo a seguir.

   ```
   select * from hms_tpch.customer limit 10:
   ```  
![\[Uma consulta DML usando uma origem dos dados padrão.\]](http://docs.aws.amazon.com/pt_br/athena/latest/ug/images/datastores-hive-default-catalog-2.png)

1. Quando você usa várias origens dos dados em uma consulta, pode omitir somente o nome da origem dos dados padrão e especificar o nome completo de qualquer origem dos dados não padrão. 

   Por exemplo, suponha que `AwsDataCatalog` esteja selecionado como origem dos dados padrão no editor de consultas. A instrução `FROM` no trecho de consulta a seguir qualifica totalmente os nomes das duas primeiras origens dos dados, mas omite o nome da terceira porque ela está no catálogo de dados do AWS Glue.

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

## Instruções DDL
<a name="datastores-hive-default-catalog-ddl-statements"></a>

As instruções DDL do Athena a seguir permitem prefixos de nome de catálogo. Prefixos de nome de catálogo em outras instruções DDL causam erros de sintaxe.

```
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$'] )]
```

Assim como acontece com as instruções DML, você pode omitir a origem dos dados e os prefixos do banco de dados da consulta quando a origem dos dados e o banco de dados são selecionados no editor de consultas.

Na imagem a seguir, a origem dos dados `hms-catalog-1` e o banco de dados `hms_tpch` são selecionados no editor de consultas. A instrução `show create table customer` é bem-sucedida mesmo que o prefixo `hms-catalog-1` e o nome do banco de dados `hms_tpch` sejam omitidos da consulta em si.

![\[Uma instrução DDL que usa o catálogo padrão.\]](http://docs.aws.amazon.com/pt_br/athena/latest/ug/images/datastores-hive-default-catalog-4.png)


## Especificar uma origem de dados padrão em uma string de conexão JDBC
<a name="datastores-hive-default-catalog-jdbc"></a>

Ao usar o driver JDBC do Athena para conectar o Athena a um metastore externo do Hive, você pode usar o parâmetro `Catalog` para especificar o nome da origem de dados padrão na string de conexão em um editor SQL, como o [SQL Workbench](https://www.sql-workbench.eu/index.html).

**nota**  
Para baixar os drivers JDBC do Athena mais recentes, consulte [Usar o Athena com o driver JDBC](https://docs.aws.amazon.com/athena/latest/ug/connect-with-jdbc.html).

A cadeia de conexão a seguir especifica a origem dos dados padrão*hms-catalog-name*.

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

A imagem a seguir mostra um exemplo de URL de conexão JDBC como configurado no SQL Workbench.

![\[Configurar um URL de conexão JDBC no SQL Workbench.\]](http://docs.aws.amazon.com/pt_br/athena/latest/ug/images/datastores-hive-default-catalog-jdbc-1.jpg)


# Trabalhar com visualizações do Hive
<a name="hive-views"></a>

Você pode usar o Athena para consultar visualizações existentes em seus metastores externos do Apache Hive. O Athena traduz as visualizações dinamicamente em tempo de execução sem alterar a visualização original ou armazenar a tradução.

Por exemplo, suponha que você tenha uma visualização do Hive que usa uma sintaxe semelhante a `LATERAL VIEW explode()`, não compatível com o Athena, como mostrado a seguir:

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

O Athena traduz a string de consulta da visualização do Hive em uma instrução que o Athena pode executar, como esta:

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

Para obter informações sobre como conectar um metastore externo do Hive ao Athena, consulte [Usar um metastore externa do Hive](connect-to-data-source-hive.md).

## Considerações e limitações
<a name="hive-views-considerations-and-limitations"></a>

Ao consultar visualizações do Hive no Athena, considere os seguintes pontos:
+ O Athena não oferece suporte à criação de visualizações do Hive. Você pode criar visualizações do Hive no seu metastore externo do Hive, que pode então ser consultado usando o Athena.
+ O Athena não oferece suporte a UDFs personalizadas para visualizações do Hive.
+ Devido a um problema conhecido no console do Athena, as visualizações do Hive aparecem na lista de tabelas, e não na lista de visualizações.
+ Embora o processo de tradução seja automático, certas funções do Hive não são compatíveis com exibições do Hive ou exigem um tratamento especial. Para obter mais informações, consulte a seção a seguir:

## Limitações de suporte às funções do Hive
<a name="hive-views-function-limitations"></a>

Esta seção destaca as funções do Hive que não são compatíveis com visualizações do Hive no Athena ou que exigem um tratamento especial. Como o Athena atualmente oferece suporte principalmente a funções do Hive 2.2.0, funções disponíveis somente em versões superiores (como Hive 4.0.0) não são compatíveis. Para obter uma lista completa de funções do Hive, consulte o [manual de idioma de UDFs do Hive](https://cwiki.apache.org/confluence/display/hive/languagemanual+udf).

### Funções agregadas
<a name="hive-views-aggregate-functions"></a>

#### Funções agregadas que exigem tratamento especial
<a name="hive-views-aggregate-functions-special-handling"></a>

A função agregada a seguir para visualizações do Hive exige um tratamento especial.
+ **Avg**: em vez de `avg(INT i)`, use `avg(CAST(i AS DOUBLE))`.

#### Funções agregadas sem suporte
<a name="hive-views-aggregate-functions-not-supported"></a>

O Athena não oferece suporte às funções agregadas do Hive a seguir para visualizações do Hive.

```
covar_pop
histogram_numeric
ntile
percentile
percentile_approx
```

O Athena não oferece suporte a funções de regressão como `regr_count`, `regr_r2` e `regr_sxx` para visualizações do Hive.

### Funções de data sem suporte
<a name="hive-views-date-functions-not-supported"></a>

O Athena não oferece suporte às funções de data do Hive a seguir para visualizações do 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)
```

### Funções de mascaramento sem suporte
<a name="hive-views-masking-functions-not-supported"></a>

O Athena não oferece suporte a funções de mascaramento do Hive como `mask()` e `mask_first_n()` para visualizações do Hive.

### Funções diversas
<a name="hive-views-miscellaneous-functions"></a>

#### Funções diversas que exigem tratamento especial
<a name="hive-views-supported-miscellaneous-functions-special-handling"></a>

As funções diversas para visualizações do Hive a seguir exigem tratamento especial.
+ **md5**: o Athena oferece suporte a `md5(binary)`, mas não a `md5(varchar)`.
+ **explode**: o Athena oferece suporte a `explode` quando usada com a seguinte sintaxe:

  ```
  LATERAL VIEW [OUTER] EXPLODE(<argument>)
  ```
+ **posexplode**: o Athena oferece suporte a `posexplode` quando usada com a seguinte sintaxe:

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

  Na saída `(pos, val)`, o Athena trata a coluna `pos` como `BIGINT`. Por isso, poderá ser necessário converter a coluna `pos` em `BIGINT` para evitar uma visualização obsoleta. O exemplo a seguir ilustra essa técnica.

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

#### Funções diversas sem suporte
<a name="hive-views-unsupported-miscellaneous-functions-not-supported"></a>

O Athena não oferece suporte às funções do Hive a seguir para visualizações do Hive.

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

### Operadores
<a name="hive-views-operators"></a>

#### Operadores que exigem tratamento especial
<a name="hive-views-operators-special-handling"></a>

Os operadores para visualizações do Hive a seguir exigem tratamento especial.
+ **Operador de módulo (%)**: como o tipo `DOUBLE` implicitamente converte em `DECIMAL(x,y)`, a sintaxe a seguir pode gerar uma mensagem de erro View is stale (Visualização obsoleta):

  ```
  a_double % 1.0 AS column
  ```

  Para contornar esse problema, use `CAST`, como no exemplo a seguir.

  ```
  CAST(a_double % 1.0 as DOUBLE) AS column
  ```
+ **Operador de divisão (/)**: no Hive , `int` dividido por `int` gera um `double`. No Athena, a mesma operação gera um truncado `int`.

#### Operadores sem suporte
<a name="hive-views-operators-not-supported"></a>

O Athena não oferece suporte aos operadores a seguir para visualizações do Hive.

**\$1A**: bitwise `NOT`

**A ^ b**: bitwise `XOR`

**A & b**: bitwise `AND`

**A \$1 b**: bitwise `OR`

**A <=> b**: retorna o mesmo resultado que o operador igual a (`=`) para operandos não nulos. Retornará `TRUE` se ambos forem `NULL`, ou `FALSE` se um deles for `NULL`.

### Funções de string
<a name="hive-views-string-functions"></a>

#### Funções de string que exigem tratamento especial
<a name="hive-views-string-functions-special-handling"></a>

As funções de string para visualizações do Hive a seguir exigem tratamento especial.
+ **chr(bigint\$1double a)**: o Hive permite argumentos negativos; o Athena não.
+ **instr(string str, string substr)**: como o mapeamento do Athena para a função `instr` retorna `BIGINT` em vez de `INT`, use a seguinte sintaxe:

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

  Sem essa etapa, a visualização será considerada obsoleta.
+ **length(string a)**: como o mapeamento do Athena para a função `length` retorna `BIGINT` em vez de `INT`, use a seguinte sintaxe para que a visualização não seja considerada obsoleta:

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

#### Funções de string sem suporte
<a name="hive-views-string-functions-not-supported"></a>

O Athena não oferece suporte às funções de string do Hive a seguir para visualizações do 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)
```

### Funções XPath sem suporte
<a name="hive-views-xpath-functions-not-supported"></a>

O Athena não oferece suporte a funções XPath do Hive como `xpath`, `xpath_short` e `xpath_int` para visualizações do Hive.

## Solução de problemas
<a name="hive-views-troubleshooting"></a>

Ao usar visualizações do Hive no Athena, você poderá encontrar os seguintes problemas:
+ **View *<view name>* is stale** (A visualização <nome da visualização> está obsoleta): esta mensagem geralmente indica uma não correspondência de tipo entre a visualização no Hive e no Athena. Se a mesma função no [manual de idioma de UDFs do Hive](https://cwiki.apache.org/confluence/display/hive/languagemanual+udf) e na documentação sobre [funções e operadores do Presto](https://prestodb.io/docs/current/functions.html) tiver assinaturas diferentes, tente converter o tipo de dado sem correspondência.
+ **Function not registered** (Função não registrada): o Athena atualmente não oferece suporte à função. Para obter mais informações, consulte as seções anteriores neste documento.

# Usar a AWS CLI com metastores do Hive
<a name="datastores-hive-cli"></a>

É possível usar os comandos da CLI `aws athena` para gerenciar os catálogos de dados do metastore do Hive que você usa com o Athena. Depois de definir um ou mais catálogos para usar com o Athena, você poderá referenciar esses catálogos em seus comandos DDL e DML `aws athena`.

## Usar a AWS CLI para gerenciar catálogos de metastore do Hive
<a name="datastores-hive-cli-manage-hive-catalogs"></a>

### Registrar um catálogo: create-data-catalog
<a name="datastores-hive-cli-registering-a-catalog"></a>

Para registrar um catálogo de dados, use o comando `create-data-catalog`. Use o parâmetro `name` para especificar o nome que você deseja usar para o catálogo. Insira o ARN da função do Lambda na opção `metadata-function` do argumento `parameters`. Para criar tags para o novo catálogo, use o parâmetro `tags` com um ou mais pares de argumentos `Key=key,Value=value` separados por espaço.

O exemplo a seguir registra o catálogo de metastore do Hive chamado `hms-catalog-1`. O comando foi formatado para legibilidade.

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

### Mostrar detalhes do catálogo: get-data-catalog
<a name="datastores-hive-cli-showing-details-of-a-catalog"></a>

Para mostrar os detalhes de um catálogo, passe o nome do catálogo para o comando `get-data-catalog`, como no exemplo a seguir.

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

O resultado de exemplo a seguir está em formato 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"
        }
    }
}
```

### Listar catálogos registrados: list-data-catalogs
<a name="datastores-hive-cli-listing-registered-catalogs"></a>

Para listar os catálogos registrados, use o comando `list-data-catalogs` e, opcionalmente, especifique uma região, como no exemplo a seguir. Os catálogos listados sempre incluem o AWS Glue.

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

O resultado de exemplo a seguir está em formato 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"
            }
        }
    ]
}
```

### Atualizar um catálogo: update-data-catalog
<a name="datastores-hive-cli-updating-a-catalog"></a>

Para atualizar um catálogo de dados, use o comando `update-data-catalog`, como no exemplo a seguir. O comando foi formatado para legibilidade.

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

### Excluir um catálogo: delete-data-catalog
<a name="datastores-hive-cli-deleting-a-catalog"></a>

Para excluir um catálogo de dados, use o comando `delete-data-catalog`, como no exemplo a seguir.

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

### Mostrar detalhes do banco de dados: get-database
<a name="datastores-hive-cli-showing-details-of-a-database"></a>

Para mostrar os detalhes de um banco de dados, passe o nome do catálogo e do banco de dados para o comando `get-database`, como no exemplo a seguir.

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

O resultado de exemplo a seguir está em formato JSON.

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

### Listar bancos de dados em um catálogo: list-databases
<a name="datastores-hive-cli-listing-databases"></a>

Para listar os bancos de dados em um catálogo, use o comando `list-databases` e, opcionalmente, especifique uma região, como no exemplo a seguir.

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

O resultado de exemplo a seguir está em formato JSON.

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

### Mostrar detalhes da tabela: get-table-metadata
<a name="datastores-hive-cli-showing-details-of-a-table"></a>

Para mostrar os metadados de uma tabela, incluindo nomes de coluna e tipos de dados, passe o nome do catálogo, banco de dados e o nome da tabela para o comando `get-table-metadata`, como no exemplo a seguir.

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

O resultado de exemplo a seguir está em formato 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"
            }
        }
}
```

### Visualizar metadados de todas as tabelas em um banco de dados: list-table-metadata
<a name="datastores-hive-cli-showing-all-table-metadata"></a>

Para mostrar os metadados de todas as tabelas em um banco de dados, passe o nome do catálogo e do nome do banco de dados para o comando `list-table-metadata`. O comando `list-table-metadata` é semelhante ao comando `get-table-metadata`, exceto que você não especifica um nome de tabela. Para limitar o número de resultados, você pode usar a opção `--max-results`, como no exemplo a seguir. 

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

O resultado de exemplo a seguir está em formato 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=="
}
```

## Executar instruções DDL e DML
<a name="datastores-hive-cli-running-ddl-and-dml"></a>

Ao usar a AWS CLI para executar instruções DDL e DML, você pode passar o nome do catálogo de metastore do Hive de uma das duas maneiras:
+ Diretamente para as declarações que são compatíveis com ele.
+ Para o parâmetro `--query-execution-context` de `Catalog`.

### Instruções DDL
<a name="datastores-hive-cli-ddl-statements"></a>

O exemplo a seguir passa o nome do catálogo diretamente como parte da instrução DDL `show create table`. O comando foi formatado para legibilidade.

```
$ 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"
```

A instrução DDL `show create table` de exemplo a seguir usa o parâmetro `Catalog` de `--query-execution-context` para passar o nome do catálogo de metastore do Hive `hms-catalog-1`. O comando foi formatado para legibilidade.

```
$ 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"
```

### Instruções DML
<a name="datastores-hive-cli-dml-statements"></a>

O exemplo da instrução DML `select` a seguir passa o nome do catálogo diretamente para a consulta. O comando foi formatado para legibilidade.

```
$ 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"
```

O seguinte exemplo da instrução DML `select` usa o parâmetro `Catalog` de `--query-execution-context` para passar o nome do catálogo de metastore do Hive `hms-catalog-1`. O comando foi formatado para legibilidade.

```
$ 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"
```

# Modificar o conector externo do Hive metastore do Athena
<a name="datastores-hive-reference-implementation"></a>

Se você tiver requisitos especiais, poderá modificar o conector Athena para o metastore externo do Hive para seu próprio uso. O Athena oferece uma implementação de referência do conector no GitHub.com em [https://github.com/awslabs/aws-athena-hive-metastore](https://github.com/awslabs/aws-athena-hive-metastore). A maioria dos casos de uso não exige que você modifique a implementação de referência. No entanto, se necessário, é possível modificar o código-fonte e criar você mesmo os artefatos.

A implementação de referência é um projeto [Apache Maven](https://maven.apache.org/) que tem os seguintes módulos:
+ `hms-service-api`: contém as operações de API entre a função do Lambda e os clientes dos serviços do Athena. Essas operações da API são definidas na interface do `HiveMetaStoreService`. Como este é um contrato de serviço, você não deve alterar nada neste módulo.
+ `hms-lambda-handler`: um conjunto de manipuladores padrão do Lambda que processa todas as chamadas de API de metastore do Hive. A classe `MetadataHandler` é o dispatcher para todas as chamadas da API. Você não precisa alterar este pacote.
+ `hms-lambda-func`: um exemplo de função do Lambda que tem os componentes a seguir.
  + `HiveMetaStoreLambdaFunc` – um exemplo de função do Lambda que estende `MetadataHandler`.
  + `ThriftHiveMetaStoreClient`: um cliente Thrift que se comunica com o metastore do Hive. Esse cliente foi escrito para o Hive 2.3.0. Se você usar uma versão diferente do Hive, talvez seja necessário atualizar essa classe para garantir que os objetos de resposta sejam compatíveis.
  + `ThriftHiveMetaStoreClientFactory`: controla o comportamento da função do Lambda. Por exemplo, você pode fornecer seu próprio conjunto de provedores de manipuladores substituindo o método `getHandlerProvider()`.
  + `hms.properties`: configura a função do Lambda. A maioria dos casos requer a atualização de apenas as duas propriedades a seguir.
    + `hive.metastore.uris` – o URI do metastore do Hive no formato `thrift://<host_name>:9083`.
    + `hive.metastore.response.spill.location`: o local do Amazon S3 para armazenar objetos de resposta quando os tamanhos excedem um determinado limite (por exemplo, 4 MB). O limite é definido na propriedade `hive.metastore.response.spill.threshold`. Não é recomendável alterar o valor padrão.
**nota**  
Essas duas propriedades podem ser substituídas pelas [variáveis de ambiente do Lambda](https://docs.aws.amazon.com/lambda/latest/dg/env_variables.html) `HMS_URIS` e `SPILL_LOCATION`. Use essas variáveis em vez de recompilar o código-fonte da função do Lambda para usar a função com um metastore do Hive ou local de vazamento diferente.
+ `hms-lambda-layer`: um projeto de montagem do Maven que coloca `hms-service-api`, `hms-lambda-handler` e suas dependências em um arquivo `.zip`. O arquivo `.zip` é registrado como uma camada do Lambda para uso por várias funções do Lambda.
+ `hms-lambda-rnp`: registra as respostas de uma função do Lambda e, em seguida, usa-as para reproduzir a resposta. É possível usar esse modelo para simular respostas do Lambda para testes.

## Criar seus próprios artefatos
<a name="datastores-hive-reference-implementation-building-the-artifacts-yourself"></a>

Após modificar o código-fonte, é possível criar os artefatos você mesmo e carregá-los em um local do Amazon S3.

Antes de criar os artefatos, atualize as propriedades `hive.metastore.uris` e `hive.metastore.response.spill.location` no arquivo `hms.properties` no módulo `hms-lambda-func`.

Para criar os artefatos, você deve ter o Apache Maven instalado e executar o comando `mvn install`. Isso gera o arquivo `.zip` de camada na pasta de saída chamada `target` no módulo `hms-lambda-layer` e o arquivo `.jar` da função do Lambda no módulo `hms-lambd-func`.