Tutorial: Uso de funções SQL espaciais com Amazon Redshift - Amazon Redshift

Tutorial: Uso de funções SQL espaciais com Amazon Redshift

Este tutorial demonstra como usar algumas das funções SQL espaciais com o Amazon Redshift.

Para fazer isso, você consulta duas tabelas usando funções SQL espaciais. O tutorial usa dados de conjuntos de dados públicos que correlacionam dados de localização de acomodações alugadas com códigos postais em Berlim, Alemanha.

Pré-requisitos

Para este tutorial, você precisa dos seguintes recursos:

Etapa 1: Criar tabelas e carregar dados de teste

Os dados de origem usados por este tutorial estão em arquivos chamados accommodations.csv e zipcodes.csv.

O arquivo accommodations.csv são dados de código aberto de insideairbnb.com. O arquivo zipcodes.csv fornece códigos postais que são dados de código aberto do instituto nacional de estatística de Berlim-Brandemburgo, na Alemanha (Amt für Statistik Berlim-Brandenburg). Ambas as fontes de dados são fornecidas sob uma licença Creative Commons. Os dados estão limitados à região de Berlim, Alemanha. Esses arquivos estão localizados em um bucket público do Amazon S3 para serem usados com este tutorial.

Opcionalmente, você pode baixar os dados de fonte dos seguintes links do Amazon S3:

Use o procedimento a seguir para criar tabelas e carregar dados de teste.

Para criar tabelas e carregar dados de teste
  1. Abra o editor de consulta do Amazon Redshift. Para obter mais informações sobre como trabalhar com o editor de consultas, consulte “Consultar um banco de dados usando o Query Editor” no Guia de gerenciamento de clusters do Amazon Redshift.

  2. Descarte todas as tabelas usadas por este tutorial se elas já existirem em seu banco de dados. Para ter mais informações, consulte Etapa 3: Limpar os recursos.

  3. Crie a tabela accommodations para armazenar a localização geográfica de cada acomodação (longitude e latitude), o nome da listagem e outros dados comerciais.

    Este tutorial explora o aluguel de quartos em Berlim, Alemanha. A coluna shape armazena pontos geográficos da localização das acomodações. As outras colunas contêm informações sobre o aluguel.

    Para criar a tabela accommodations, execute a instrução SQL a seguir no editor de consulta do Amazon Redshift.

    CREATE TABLE public.accommodations ( id INTEGER PRIMARY KEY, shape GEOMETRY, name VARCHAR(100), host_name VARCHAR(100), neighbourhood_group VARCHAR(100), neighbourhood VARCHAR(100), room_type VARCHAR(100), price SMALLINT, minimum_nights SMALLINT, number_of_reviews SMALLINT, last_review DATE, reviews_per_month NUMERIC(8,2), calculated_host_listings_count SMALLINT, availability_365 SMALLINT );
  4. Crie a tabela zipcode no editor de consulta para armazenar os códigos postais de Berlim.

    O código postal é definido como um polígono na coluna wkb_geometry. O resto das colunas descrevem metadados espaciais adicionais sobre o código postal.

    Para criar a tabela zipcode, execute a instrução SQL a seguir no editor de consulta do Amazon Redshift.

    CREATE TABLE public.zipcode ( ogc_field INTEGER PRIMARY KEY NOT NULL, wkb_geometry GEOMETRY, gml_id VARCHAR(256), spatial_name VARCHAR(256), spatial_alias VARCHAR(256), spatial_type VARCHAR(256) );
  5. Carregue as tabelas usando dados de amostra.

    Os dados de amostra para este tutorial são fornecidos em um bucket do Amazon S3 que permite acesso de leitura a todos os usuários da AWS autenticados. Certifique-se de fornecer credenciais da AWS válidas que permitem o acesso ao Amazon S3.

    Para carregar dados de teste para suas tabelas, execute os comandos COPY a seguir. Substitua account-number pelo número da sua conta da AWS. O segmento da string de credenciais entre aspas simples não pode conter espaços ou quebras de linha.

    COPY public.accommodations FROM 's3://redshift-downloads/spatial-data/accommodations.csv' DELIMITER ';' IGNOREHEADER 1 REGION 'us-east-1' CREDENTIALS 'aws_iam_role=arn:aws:iam::account-number:role/mySpatialDemoRole';
    COPY public.zipcode FROM 's3://redshift-downloads/spatial-data/zipcode.csv' DELIMITER ';' IGNOREHEADER 1 REGION 'us-east-1' CREDENTIALS 'aws_iam_role=arn:aws:iam::account-number:role/mySpatialDemoRole';
  6. Verifique se cada tabela foi carregada corretamente executando os comandos a seguir.

    select count(*) from accommodations;
    select count(*) from zipcode;

    Os resultados a seguir mostram o número de linhas em cada tabela de dados de teste.

    Nome da tabela Linhas
    acomodações 22.248
    código postal 190

Etapa 2: Consultar dados espaciais

Depois que suas tabelas são criadas e carregadas, você pode consultá-las usando instruções SQL SELECT. As consultas a seguir demonstram algumas das informações que você pode recuperar. Você pode escrever muitas outras consultas que usam funções espaciais para satisfazer suas necessidades.

Para consultar dados espaciais
  1. Consulte para obter a contagem do número total de listagens armazenadas na tabela accommodations, conforme mostrado a seguir. O sistema de referência espacial é o Sistema Geodésico Mundial (WGS - World Geodetic System) 84, que possui o identificador de referência espacial único 4326.

    SELECT count(*) FROM public.accommodations WHERE ST_SRID(shape) = 4326;
    count ------- 22248
  2. Obtém os objetos de geometria em formato de texto bem-conhecido (WKT - Well-Known Text) com alguns atributos adicionais. Além disso, você pode validar se esses dados de código postal também são armazenados no Sistema Geodésico Mundial (WGS) 84, que usa o ID de referência espacial (SRID) 4326. Os dados geográficos devem ser armazenados no mesmo sistema de referência espacial para serem interoperáveis.

    SELECT ogc_field, spatial_name, spatial_type, ST_SRID(wkb_geometry), ST_AsText(wkb_geometry) FROM public.zipcode ORDER BY spatial_name;
    ogc_field spatial_name spatial_type st_srid st_astext --------------------------------------------------------------- 0 10115 Polygon 4326 POLYGON((...)) 4 10117 Polygon 4326 POLYGON((...)) 8 10119 Polygon 4326 POLYGON((...)) ... (190 rows returned)
  3. Selecione o polígono de Berlin Mitte (10117), um bairro de Berlim, no formato GeoJSON, sua dimensão e o número de pontos neste polígono.

    SELECT ogc_field, spatial_name, ST_AsGeoJSON(wkb_geometry), ST_Dimension(wkb_geometry), ST_NPoints(wkb_geometry) FROM public.zipcode WHERE spatial_name='10117';
    ogc_field spatial_name spatial_type st_dimension st_npoint ----------------------------------------------------------------------------------------------- 4 10117 {"type":"Polygon", "coordinates":[[[...]]]} 2 331
  4. Execute o seguinte comando SQL para ver quantas acomodações estão dentro de 500 metros do Portão de Brandemburgo.

    SELECT count(*) FROM public.accommodations WHERE ST_DistanceSphere(shape, ST_GeomFromText('POINT(13.377704 52.516431)', 4326)) < 500;
    count ------ 29
  5. Obtenha a localização aproximada do Portão de Brandemburgo a partir de dados armazenados nas acomodações que estão listadas como próximas, executando a seguinte consulta.

    Esta consulta requer uma subseleção. Isso leva a uma contagem diferente porque o local solicitado não é o mesmo que a consulta anterior porque está mais perto das acomodações.

    WITH poi(loc) as ( SELECT st_astext(shape) FROM accommodations WHERE name LIKE '%brandenburg gate%' ) SELECT count(*) FROM accommodations a, poi p WHERE ST_DistanceSphere(a.shape, ST_GeomFromText(p.loc, 4326)) < 500;
    count ------ 60
  6. Execute a seguinte consulta para mostrar os detalhes de todas as acomodações ao redor do Portão de Brandemburgo, ordenadas por preço em ordem decrescente.

    SELECT name, price, ST_AsText(shape) FROM public.accommodations WHERE ST_DistanceSphere(shape, ST_GeomFromText('POINT(13.377704 52.516431)', 4326)) < 500 ORDER BY price DESC;
    name price st_astext ------------------------------------------------------------------------------------------------------- DUPLEX APARTMENT/PENTHOUSE in 5* LOCATION! 7583 300 POINT(13.3826510209548 52.5159819722552) DUPLEX-PENTHOUSE IN FIRST LOCATION! 7582 300 POINT(13.3799997083855 52.5135918444834) ... (29 rows returned)
  7. Execute a consulta a seguir para recuperar a acomodação mais cara com o seu código postal.

    SELECT a.price, a.name, ST_AsText(a.shape), z.spatial_name, ST_AsText(z.wkb_geometry) FROM accommodations a, zipcode z WHERE price = 9000 AND ST_Within(a.shape, z.wkb_geometry);
    price name st_astext spatial_name st_astext ------------------------------------------------------------------------------------------------------------------------------------------------- 9000 Ueber den Dächern Berlins Zentrum POINT(13.334436985013 52.4979779501538) 10777 POLYGON((13.3318284987227 52.4956021172799,...
  8. Calcule o preço máximo, mínimo ou mediano das acomodações usando uma subconsulta.

    A consulta a seguir lista o preço mediano das acomodações por código postal.

    SELECT a.price, a.name, ST_AsText(a.shape), z.spatial_name, ST_AsText(z.wkb_geometry) FROM accommodations a, zipcode z WHERE ST_Within(a.shape, z.wkb_geometry) AND price = (SELECT median(price) FROM accommodations) ORDER BY a.price;
    price name st_astext spatial_name st_astext --------------------------------------------------------------------------------------------------------------------------------------------- 45 "Cozy room Berlin-Mitte" POINT(13.3864349535358 52.5292016386514) 10115 POLYGON((13.3658598465795 52.535659581048,... ... (723 rows returned)
  9. Execute a consulta a seguir para recuperar o número de acomodações listadas em Berlim. Para encontrar os hot spots, estes são agrupados por código postal e classificados pela quantidade de fornecimento.

    SELECT z.spatial_name as zip, count(*) as numAccommodations FROM public.accommodations a, public.zipcode z WHERE ST_Within(a.shape, z.wkb_geometry) GROUP BY zip ORDER BY numAccommodations DESC;
    zip numaccommodations ---------------------------- 10245 872 10247 832 10437 733 10115 664 ... (187 rows returned)

Etapa 3: Limpar os recursos

O cluster continua a acumular cobranças enquanto estiver em execução. Ao concluir este tutorial, você pode excluir seu cluster de amostra.

Se você deseja manter o cluster, mas recuperar o armazenamento usado pelas tabelas de dados de teste, execute os comandos a seguir para excluir as tabelas.

drop table public.accommodations cascade;
drop table public.zipcode cascade;