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:
Se você estiver usando o Redshift Spectrum com um catálogo de dados do Athena ou um catálogo de dados do AWS Glue, siga as etapas descritas em Para criar uma função do IAM para o Amazon Redshift.
Se você estiver usando o Redshift Spectrum com um AWS Glue Data Catalog habilitado para AWS Lake Formation, siga as etapas descritas nestes procedimentos:
Para criar uma função do IAM para o Amazon Redshift
-
Abra o console do IAM
. -
No painel de navegação, escolha Roles.
-
Escolha Criar Perfil.
-
Selecione Serviço da AWS como a entidade confiável e, depois, Redshift como caso de uso.
-
Em Caso de uso para outros Serviços da AWS, selecione Redshift: personalizável e Próximo.
-
A página Add permissions policy (Adicionar política de permissões) é exibida. Escolha
AmazonS3ReadOnlyAccess
eAWSGlueConsoleFullAccess
se estiver usando o catálogo de dados do AWS Glue. Ou escolhaAmazonAthenaFullAccess
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/*" } ] }
-
Para Role name (Nome da função), digite um nome para sua função, por exemplo,
myspectrum_role
. -
Revise as informações e escolha Create role.
-
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
-
Abra o console do IAM em https://console.aws.amazon.com/iam/
. -
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.
-
Escolha Criar política.
-
Opte por criar a política na guia JSON.
-
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": "*" } ] }
-
Ao terminar, escolha Review (Revisar) para revisar a política. O validador de política indica se há qualquer erro de sintaxe.
-
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:
-
Usuários e grupos no AWS IAM Identity Center:
Crie um conjunto de permissões. Siga as instruções em Criação de um conjunto de permissões no Guia do usuário do AWS IAM Identity Center.
-
Usuários gerenciados no IAM com provedor de identidades:
Crie um perfil para a federação de identidades. Siga as instruções em Criando um perfil para um provedor de identidades de terceiros (federação) no Guia do Usuário do IAM.
-
Usuários do IAM:
-
Crie um perfil que seu usuário possa assumir. Siga as instruções em Criação de um perfil para um usuário do IAM no Guia do usuário do IAM.
-
(Não recomendado) Vincule uma política diretamente a um usuário ou adicione um usuário a um grupo de usuários. Siga as instruções em Adição de permissões a um usuário (console) no Guia do usuário do IAM.
-
Para conceder permissões SELECT na tabela para consultar no banco de dados do Lake Formation
-
Abra o console do Lake Formation em https://console.aws.amazon.com/lakeformation/
. -
No painel de navegação, escolha Permissões do data lake e Conceder.
-
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.
-
-
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
-
Faça login no AWS Management Console e abra o console do Amazon Redshift em https://console.aws.amazon.com/redshiftv2/
. -
No menu de navegação, escolha Clusters e o nome do cluster que deseja atualizar.
-
Em Actions (Ações), escolha Manage IAM roles (Gerenciar funções do IAM). A página IAM roles (Funções do IAM) é exibida.
-
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).
-
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
-
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;
-
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 --recursiveA 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.000create 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
-
Obtenha o número de linhas na tabela MYSPECTRUM_SCHEMA.SALES.
select count(*) from myspectrum_schema.sales;
count ------ 172462
-
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);
-
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
-
Visualize o plano da consulta para a consulta anterior. As etapas
S3 Seq Scan
,S3 HashAggregate
eS3 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 RedshiftUm esquema externo chamado
myspectrum_schema
Uma tabela externa chamada
sales
em um bucket do Amazon S3Uma tabela do Redshift chamada
event
carregada com dados
Para iniciar sua pilha Redshift Spectrum Getting Started DataLake CloudFormation
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. Escolha Próximo.
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.
Escolha Próximo.
São exibidas as opções de pilha.
Selecione Next (Próximo) para aceitar as configurações padrão.
Revise as informações e, em Recursos, selecione Estou ciente de que o AWS CloudFormation pode criar recursos do IAM.
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)