Conceitos básicos do Amazon Redshift Spectrum - Amazon Redshift

Conceitos básicos do Amazon Redshift Spectrum

Neste tutorial, você aprenderá como usar o Amazon Redshift Spectrum para consultar dados diretamente dos arquivos no Amazon S3. Se você já tiver um cluster e um cliente SQL, poderá concluir este tutorial com configuração mínima.

nota

As consultas do Redshift Spectrum estão sujeitas a cobranças adicionais. O custo da execução de consultas de exemplo neste tutorial é nominal. Para obter mais informações sobre preços, consulte Definição de preços do Amazon Redshift Spectrum.

Pré-requisitos

Para usar o Redshift Spectrum, é necessário um cluster do Amazon Redshift e um cliente SQL conectado ao cluster, de modo que você possa executar comandos de SQL. O cluster e os arquivos de dados do Amazon S3 devem estar localizados na mesma Região da AWS.

Consulte informações sobre como criar um cluster do Amazon Redshift em Clusters provisionados do Amazon Redshift no Guia de conceitos básicos do Amazon Redshift. Para ter informações sobre formas de se conectar a um cluster, consulte Connecting to Amazon Redshift data warehouses no Guia de conceitos básicos do Amazon Redshift.

Em alguns dos exemplos a seguir, os dados de exemplo estão na região Leste dos EUA (Norte da Virgínia) (us-east-1), então você precisa de um cluster que também esteja em us-east-1. Ou você pode usar o Amazon S3 para copiar objetos de dados dos seguintes buckets e pastas para o seu bucket na Região da AWS onde o cluster está localizado:

  • s3://redshift-downloads/tickit/spectrum/customers/*

  • s3://redshift-downloads/tickit/spectrum/sales_partition/*

  • s3://redshift-downloads/tickit/spectrum/sales/*

  • s3://redshift-downloads/tickit/spectrum/salesevent/*

Execute um comando do Amazon S3 semelhante ao apresentado a seguir para copiar dados de exemplo localizados na região Leste dos EUA (Norte da Virgínia) para sua Região da AWS. Antes de executar o comando, crie o bucket e as pastas no bucket para que correspondam ao comando copy do Amazon S3. A saída do comando copy do Amazon S3 confirma que os arquivos são copiados para o nome-do-bucket na Região da AWS desejada.

aws s3 cp s3://redshift-downloads/tickit/spectrum/ s3://bucket-name/tickit/spectrum/ --copy-props none --recursive

Conceitos básicos do Amazon Redshift Spectrum usando o AWS CloudFormation

Como alternativa às etapas a seguir, é possível acessar o template Redshift Spectrum DataLake AWS CloudFormation para criar uma pilha com um bucket do Amazon S3 que você pode consultar. Para obter mais informações, consulte Iniciar a pilha do AWS CloudFormation e consultar seus dados no Amazon S3.

Conceitos básicos detalhados do Amazon Redshift Spectrum

Para começar a usar o Amazon Redshift Spectrum, siga as seguintes etapas:

Etapa 1. Criar uma função do IAM para o Amazon Redshift

O cluster precisa de autorização para acessar o catálogo de dados externo no AWS Glue ou no Amazon Athena e os arquivos de dados no Amazon S3. Para fornecer essa autorização, referencie a função do AWS Identity and Access Management (IAM) que é associada ao cluster. Para obter mais informações sobre como usar funções com o Amazon Redshift, consulte Autorização das operações COPY e UNLOAD usando as funções do IAM.

nota

Em determinados casos, é possível migrar o catálogo de dados do Athena para um catálogo de dados do AWS Glue. Isso poderá ser feito se o cluster estiver em uma região da AWS compatível com o AWS Glue e se você tiver tabelas externas do Redshift Spectrum no catálogo de dados do Athena. Para usar o catálogo de dados do AWS Glue com o Redshift Spectrum, talvez seja necessário alterar as políticas do IAM. Para obter mais informações, consulte Atualizar para o catálogo de dados do AWS Glue no Manual do usuário do Athena.

Ao criar uma função para o Amazon Redshift, escolha uma das seguintes abordagens:

Para criar uma função do IAM para o Amazon Redshift
  1. Abra o console do IAM.

  2. No painel de navegação, escolha Roles.

  3. Escolha Criar Perfil.

  4. Selecione Serviço da AWS como a entidade confiável e, depois, Redshift como caso de uso.

  5. Em Caso de uso para outros Serviços da AWS, selecione Redshift: personalizável e Próximo.

  6. A página Add permissions policy (Adicionar política de permissões) é exibida. Escolha AmazonS3ReadOnlyAccess e AWSGlueConsoleFullAccess se estiver usando o catálogo de dados do AWS Glue. Ou escolha AmazonAthenaFullAccess se estiver usando o catálogo de dados do Athena. Escolha Próximo.

    nota

    A política AmazonS3ReadOnlyAccess concede ao seu cluster acesso somente leitura a todos os buckets do Amazon S3. Para conceder acesso apenas ao bucket de dados de amostra da AWS, crie uma nova política e adicione as permissões a seguir.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:Get*", "s3:List*" ], "Resource": "arn:aws:s3:::redshift-downloads/*" } ] }
  7. Para Role name (Nome da função), digite um nome para sua função, por exemplo, myspectrum_role.

  8. Revise as informações e escolha Create role.

  9. No painel de navegação, escolha Perfis. Escolha o nome de sua nova função para visualizar o resumo e copie o Nome de recurso da Amazon (ARN) da função em sua área de transferência. Esse valor é o nome de recurso da Amazon (ARN) para a função que você acaba de criar. Esse valor é usado quando tabelas externas são criadas para referenciar os arquivos de dados no Amazon S3.

Para criar uma função do IAM para o Amazon Redshift usando um AWS Glue Data Catalog habilitado para o AWS Lake Formation
  1. Abra o console do IAM em https://console.aws.amazon.com/iam/.

  2. No painel de navegação, escolha Policies.

    Se essa for a primeira vez que você escolhe Políticas, a página Bem-vindo às políticas gerenciadas será exibida. Escolha Começar.

  3. Escolha Criar política.

  4. Opte por criar a política na guia JSON.

  5. Cole no documento de política JSON a seguir, que concede acesso ao catálogo de dados, mas nega as permissões de administrador para o Lake Formation.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "RedshiftPolicyForLF", "Effect": "Allow", "Action": [ "glue:*", "lakeformation:GetDataAccess" ], "Resource": "*" } ] }
  6. Ao terminar, escolha Review (Revisar) para revisar a política. O validador de política indica se há qualquer erro de sintaxe.

  7. Na página Review policy (Revisar política), em Name (Nome), insira myspectrum_policy para dar um nome à política que você está criando. Insira uma Description (Descrição) (opcional). Revise o Resumo da política para ver as permissões que são concedidas pela política. Em seguida, escolha Criar política para salvar seu trabalho.

    Depois de criar uma política, você pode conceder acesso aos usuários.

Para conceder acesso, adicione as permissões aos seus usuários, grupos ou perfis:

Para conceder permissões SELECT na tabela para consultar no banco de dados do Lake Formation
  1. Abra o console do Lake Formation em https://console.aws.amazon.com/lakeformation/.

  2. No painel de navegação, escolha Permissões do data lake e Conceder.

  3. Siga as instruções em Concessão das permissões da tabela usando o nome do recurso nomeado no Guia do desenvolvedor do AWS Lake Formation. Forneça as informações a seguir:

    • Para a Função do IAM, selecione a função do IAM criada, myspectrum_role. Ao executar o editor de consulta do Amazon Redshift, ele usa essa função do IAM para conceder permissão aos dados.

      nota

      Para conceder permissão SELECT na tabela em um catálogo de dados habilitado para o Lake Formation para consulta, faça o seguinte:

      • Registre o caminho dos dados no Lake Formation.

      • Conceda aos usuários permissão para esse caminho no Lake Formation.

      • As tabelas criadas podem ser encontradas no caminho registrado no Lake Formation.

  4. Selecione Conceder.

Importante

Como prática recomendada, permita o acesso somente aos objetos subjacentes do Amazon S3 por meio de permissões do Lake Formation. Para impedir o acesso não aprovado, remova qualquer permissão concedida aos objetos do Amazon S3 fora do Lake Formation. Se você já tiver acessado objetos do Amazon S3 antes de configurar o Lake Formation, remova políticas do IAM ou permissões de bucket que tenham sido configuradas anteriormente. Para obter mais informações, consulte Atualizar permissões de dados do AWS Glue para o modelo do AWS Lake Formation e Permissões do Lake Formation.

Etapa 2: Associar uma função do IAM ao cluster

Agora, você tem uma função do IAM que autoriza o Amazon Redshift a acessar o catálogo de dados externo e o Amazon S3 para você. Nesse ponto, você deve associar essa função a seu cluster do Amazon Redshift.

Para associar uma função do IAM a um cluster
  1. Faça login no AWS Management Console e abra o console do Amazon Redshift em https://console.aws.amazon.com/redshiftv2/.

  2. No menu de navegação, escolha Clusters e o nome do cluster que deseja atualizar.

  3. Em Actions (Ações), escolha Manage IAM roles (Gerenciar funções do IAM). A página IAM roles (Funções do IAM) é exibida.

  4. Escolha Enter ARN (Digitar ARN) e insira um ARN ou um perfil do IAM ou escolha um perfil do IAM na lista. Depois, escolha Add IAM role (Adicionar função do IAM) para adicioná-la à lista Attached IAM roles (Funções do IAM anexadas).

  5. Escolha Done (Concluído) para associar a função do IAM ao cluster. O cluster é modificado para concluir a alteração.

Etapa 3: Criar um esquema e uma tabela externos

Crie tabelas externas em um esquema externo. O esquema externo faz referência a um banco de dados no catálogo de dados externo e fornece o ARN da função do IAM que autoriza o cluster a acessar o Amazon S3 em seu nome. É possível criar um banco de dados externo em um catálogo de dados do Amazon Athena, no AWS Glue Data Catalog ou em uma metastore do Apache Hive, como o Amazon EMR. Neste exemplo, você cria o banco de dados externo em um catálogo de dados do Amazon Athena ao criar o esquema externo do Amazon Redshift. Para obter mais informações, consulte Esquemas externos no Amazon Redshift Spectrum.

Para criar um esquema e uma tabela externos
  1. Para criar um esquema externo, substitua o nome de recurso da Amazon (ARN) da função do IAM no comando a seguir pelo ARN da função que você criou na etapa 1. Execute o comando no cliente SQL.

    create external schema myspectrum_schema from data catalog database 'myspectrum_db' iam_role 'arn:aws:iam::123456789012:role/myspectrum_role' create external database if not exists;
  2. Para criar uma tabela externa, execute o seguinte comando CREATE EXTERNAL TABLE.

    nota

    O cluster e o bucket do Amazon S3 devem estar na mesma Região da AWS. Neste exemplo, o comando CREATE EXTERNAL TABLE, o bucket do Amazon S3 com os dados de exemplo está localizado na Região da AWS Leste dos EUA (Norte da Virgínia). Para ver os dados de origem, baixe o arquivo sales_ts.000.

    Você pode modificar este exemplo para ser executado em umaRegião da AWS diferente. Crie um bucket do Amazon S3 na Região da AWS desejada. Copie os dados de vendas com um comando copy do Amazon S3. Depois, atualize a opção de local do bucket no comando CREATE EXTERNAL TABLE de exemplo.

    aws s3 cp s3://redshift-downloads/tickit/spectrum/sales/ s3://bucket-name/tickit/spectrum/sales/ --copy-props none --recursive

    A saída do comando copy do Amazon S3 confirma que o arquivo foi copiado para o nome-do-bucket na Região da AWS desejada.

    copy: s3://redshift-downloads/tickit/spectrum/sales/sales_ts.000 to s3://bucket-name/tickit/spectrum/sales/sales_ts.000
    create external table myspectrum_schema.sales( salesid integer, listid integer, sellerid integer, buyerid integer, eventid integer, dateid smallint, qtysold smallint, pricepaid decimal(8,2), commission decimal(8,2), saletime timestamp) row format delimited fields terminated by '\t' stored as textfile location 's3://redshift-downloads/tickit/spectrum/sales/' table properties ('numRows'='172000');

Etapa 4: Consultar os dados no Amazon S3

Após criar as tabelas externas, você pode consultá-las usando as mesmas instruções SELECT usadas nas consultas de outras tabelas do Amazon Redshift. Essas consultas com instruções SELECT incluem junções de tabelas, agregação de dados e filtragem de predicados.

Para consultar os dados no Amazon S3
  1. Obtenha o número de linhas na tabela MYSPECTRUM_SCHEMA.SALES.

    select count(*) from myspectrum_schema.sales;
    count 
    ------
    172462
  2. Mantenha suas tabelas de fatos maiores no Amazon S3 e suas tabelas de dimensões menores no Amazon Redshift como prática recomendada. Se você tiver carregado os dados de exemplo apresentados em Carregar dados de amostra, já deverá ter uma tabela chamada EVENT no banco de dados. Caso contrário, crie a tabela EVENT usando o comando a seguir.

    create table event( eventid integer not null distkey, venueid smallint not null, catid smallint not null, dateid smallint not null sortkey, eventname varchar(200), starttime timestamp);
  3. Carregue a tabela EVENT substituindo o ARN da função do IAM no comando COPY a seguir pelo ARN da função que você criou em Etapa 1. Criar uma função do IAM para o Amazon Redshift. Opcionalmente, você pode baixar e visualizar os dados de origem para o allevents_pipe.txt de um bucket do Amazon S3 na Região da AWS us-east-1.

    copy event from 's3://redshift-downloads/tickit/allevents_pipe.txt' iam_role 'arn:aws:iam::123456789012:role/myspectrum_role' delimiter '|' timeformat 'YYYY-MM-DD HH:MI:SS' region 'us-east-1';

    O exemplo a seguir une a tabela externa MYSPECTRUM_SCHEMA.SALES do Amazon S3 com a tabela local EVENT do Amazon Redshift para encontrar o total de vendas para os dez eventos principais.

    select top 10 myspectrum_schema.sales.eventid, sum(myspectrum_schema.sales.pricepaid) from myspectrum_schema.sales, event where myspectrum_schema.sales.eventid = event.eventid and myspectrum_schema.sales.pricepaid > 30 group by myspectrum_schema.sales.eventid order by 2 desc;
    eventid | sum     
    --------+---------
        289 | 51846.00
       7895 | 51049.00
       1602 | 50301.00
        851 | 49956.00
       7315 | 49823.00
       6471 | 47997.00
       2118 | 47863.00
        984 | 46780.00
       7851 | 46661.00
       5638 | 46280.00
  4. Visualize o plano da consulta para a consulta anterior. As etapas S3 Seq Scan, S3 HashAggregate e S3 Query Scan foram executadas com os dados do Amazon S3.

    explain select top 10 myspectrum_schema.sales.eventid, sum(myspectrum_schema.sales.pricepaid) from myspectrum_schema.sales, event where myspectrum_schema.sales.eventid = event.eventid and myspectrum_schema.sales.pricepaid > 30 group by myspectrum_schema.sales.eventid order by 2 desc;
    QUERY PLAN ----------------------------------------------------------------------------- XN Limit (cost=1001055770628.63..1001055770628.65 rows=10 width=31) -> XN Merge (cost=1001055770628.63..1001055770629.13 rows=200 width=31) Merge Key: sum(sales.derived_col2) -> XN Network (cost=1001055770628.63..1001055770629.13 rows=200 width=31) Send to leader -> XN Sort (cost=1001055770628.63..1001055770629.13 rows=200 width=31) Sort Key: sum(sales.derived_col2) -> XN HashAggregate (cost=1055770620.49..1055770620.99 rows=200 width=31) -> XN Hash Join DS_BCAST_INNER (cost=3119.97..1055769620.49 rows=200000 width=31) Hash Cond: ("outer".derived_col1 = "inner".eventid) -> XN S3 Query Scan sales (cost=3010.00..5010.50 rows=200000 width=31) -> S3 HashAggregate (cost=3010.00..3010.50 rows=200000 width=16) -> S3 Seq Scan myspectrum_schema.sales location:"s3://redshift-downloads/tickit/spectrum/sales" format:TEXT (cost=0.00..2150.00 rows=172000 width=16) Filter: (pricepaid > 30.00) -> XN Hash (cost=87.98..87.98 rows=8798 width=4) -> XN Seq Scan on event (cost=0.00..87.98 rows=8798 width=4)

Iniciar a pilha do AWS CloudFormation e consultar seus dados no Amazon S3

Depois de criar um cluster do Amazon Redshift e se conectar ao cluster, você pode instalar o template do AWS CloudFormation Redshift Spectrum DataLake e consultar seus dados.

O CloudFormation instala o modelo Redshift Spectrum Getting Started DataLake e cria uma pilha contendo:

  • Uma função chamada myspectrum_role associada ao cluster do Redshift

  • Um esquema externo chamado myspectrum_schema

  • Uma tabela externa chamada sales em um bucket do Amazon S3

  • Uma tabela do Redshift chamada event carregada com dados

Para iniciar sua pilha Redshift Spectrum Getting Started DataLake CloudFormation
  1. Selecione Launch CFN stack (Iniciar pilha do CFN). O console do CloudFormation abrirá com o modelo Datalake.yml selecionado.

    Você também pode baixar e personalizar o modelo do CFN, depois abrir o console do CloudFormation (https://console.aws.amazon.com/cloudformation) e criar uma pilha com o modelo personalizado.

  2. Escolha Próximo.

  3. Em Parameters (Parâmetros), digite o nome do cluster do Amazon Redshift, o nome do banco de dados e o nome de usuário do banco de dados.

  4. Escolha Próximo.

    São exibidas as opções de pilha.

  5. Selecione Next (Próximo) para aceitar as configurações padrão.

  6. Revise as informações e, em Recursos, selecione Estou ciente de que o AWS CloudFormation pode criar recursos do IAM.

  7. Selecione Criar pilha.

Se ocorrer um erro durante a criação da pilha, consulte estas informações:

  • Acesse a guia Events (Eventos) do CloudFormation para obter informações que podem ajudar você a solucionar o erro.

  • Exclua a pilha do DataLake CloudFormation antes de tentar a realizar a operação novamente.

  • Verifique se você está conectado ao banco de dados do Amazon Redshift.

  • Verifique se inseriu as informações corretas do nome do cluster, nome do banco de dados e nome de usuário do banco de dados do Amazon Redshift.

Consultar seus dados no Amazon S3

Consulte tabelas externas usando as mesmas instruções SELECT usadas nas consultas de outras tabelas do Amazon Redshift. Essas consultas com instruções SELECT incluem junções de tabelas, agregação de dados e filtragem de predicados.

A consulta a seguir retorna o número de linhas na tabela externa myspectrum_schema.sales.

select count(*) from myspectrum_schema.sales;
count 
------
172462

Unir uma tabela externa com uma tabela local

O exemplo a seguir une a tabela externa myspectrum_schema.sales e a tabela local event para encontrar as vendas totais para os 10 eventos principais.

select top 10 myspectrum_schema.sales.eventid, sum(myspectrum_schema.sales.pricepaid) from myspectrum_schema.sales, event where myspectrum_schema.sales.eventid = event.eventid and myspectrum_schema.sales.pricepaid > 30 group by myspectrum_schema.sales.eventid order by 2 desc;
eventid | sum     
--------+---------
    289 | 51846.00
   7895 | 51049.00
   1602 | 50301.00
    851 | 49956.00
   7315 | 49823.00
   6471 | 47997.00
   2118 | 47863.00
    984 | 46780.00
   7851 | 46661.00
   5638 | 46280.00

Visualizar o plano de consulta

Visualize o plano da consulta para a consulta anterior. Observe que as etapas S3 Seq Scan, S3 HashAggregate e S3 Query Scan foram executadas com os dados do Amazon S3.

explain select top 10 myspectrum_schema.sales.eventid, sum(myspectrum_schema.sales.pricepaid) from myspectrum_schema.sales, event where myspectrum_schema.sales.eventid = event.eventid and myspectrum_schema.sales.pricepaid > 30 group by myspectrum_schema.sales.eventid order by 2 desc;
QUERY PLAN ----------------------------------------------------------------------------- XN Limit (cost=1001055770628.63..1001055770628.65 rows=10 width=31) -> XN Merge (cost=1001055770628.63..1001055770629.13 rows=200 width=31) Merge Key: sum(sales.derived_col2) -> XN Network (cost=1001055770628.63..1001055770629.13 rows=200 width=31) Send to leader -> XN Sort (cost=1001055770628.63..1001055770629.13 rows=200 width=31) Sort Key: sum(sales.derived_col2) -> XN HashAggregate (cost=1055770620.49..1055770620.99 rows=200 width=31) -> XN Hash Join DS_BCAST_INNER (cost=3119.97..1055769620.49 rows=200000 width=31) Hash Cond: ("outer".derived_col1 = "inner".eventid) -> XN S3 Query Scan sales (cost=3010.00..5010.50 rows=200000 width=31) -> S3 HashAggregate (cost=3010.00..3010.50 rows=200000 width=16) -> S3 Seq Scan spectrum.sales location:"s3://redshift-downloads/tickit/spectrum/sales" format:TEXT (cost=0.00..2150.00 rows=172000 width=16) Filter: (pricepaid > 30.00) -> XN Hash (cost=87.98..87.98 rows=8798 width=4) -> XN Seq Scan on event (cost=0.00..87.98 rows=8798 width=4)