

 Amazon Redshift dejará de admitir la creación de nuevas UDF de Python a partir del parche 198. Las UDF de Python existentes seguirán funcionando hasta el 30 de junio de 2026. Para obtener más información, consulte la [publicación del blog](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/). 

# Tutorial: Uso de funciones SQL espaciales con Amazon Redshift
<a name="spatial-tutorial"></a>

En este tutorial, se muestra cómo utilizar algunas de las funciones SQL espaciales con Amazon Redshift. 

Para ello, debe consultar dos tablas utilizando funciones SQL espaciales. En el tutorial, se utilizan datos de conjuntos de datos públicos que relacionan los datos de ubicación de los alojamientos de alquiler con los códigos postales en Berlín, Alemania. 

**Topics**
+ [Requisitos previos](#spatial-tutorial-prerequisites)
+ [Paso 1: Crear tablas y cargar datos de prueba](#spatial-tutorial-test-data)
+ [Paso 2: Consultar los datos espaciales](#spatial-tutorial-query)
+ [Paso 3: Eliminar los recursos](#spatial-tutorial-clean-up)

## Requisitos previos
<a name="spatial-tutorial-prerequisites"></a>

Para este tutorial, necesita los siguientes recursos:
+ Un clúster y una base de datos de Amazon Redshift existentes a los que pueda acceder y actualizar. En el clúster existente, puede crear tablas, cargar datos de muestra y ejecutar consultas SQL para mostrar las funciones espaciales. El clúster debe tener dos nodos como mínimo. Para obtener información acerca de cómo crear un clúster, siga los pasos que se indican en la [Guía de introducción a Amazon Redshift](https://docs.aws.amazon.com/redshift/latest/gsg/). 
+ Para utilizar el editor de consultas de Amazon Redshift, asegúrese de que el clúster se encuentra en una región de AWS que sea compatible con el editor de consultas. Para obtener más información, consulte [Consulta de una base de datos mediante el editor de consultas](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor.html) en la *Guía de administración de Amazon Redshift*. 
+ AWSCredenciales de para su clúster de Amazon Redshift que le permiten cargar datos de prueba desde Amazon S3. Para obtener información sobre cómo acceder a otros servicios de AWS, como Amazon S3, consulte [Autorización a Amazon Redshift para obtener acceso a los servicios de AWS](https://docs.aws.amazon.com/redshift/latest/mgmt/authorizing-redshift-service.html).
+ El rol de AWS Identity and Access Management (IAM) denominado `mySpatialDemoRole`, que tiene la política administrada `AmazonS3ReadOnlyAccess` adjuntada para leer los datos de Amazon S3. Para crear un rol que tenga permiso para cargar datos de un bucket de Amazon S3, consulte [Autorización de las operaciones COPY, UNLOAD y CREATE EXTERNAL SCHEMA mediante los roles de IAM](https://docs.aws.amazon.com/redshift/latest/mgmt/copy-unload-iam-role.html) en la *Guía de administración de Amazon Redshift*. 
+ Después de crear el rol de IAM `mySpatialDemoRole`, este necesita asociarse con su clúster de Amazon Redshift. Para obtener más información acerca de cómo crear esa asociación, consulte [Autorización de las operaciones COPY, UNLOAD y CREATE EXTERNAL SCHEMA mediante los roles de IAM](https://docs.aws.amazon.com/redshift/latest/mgmt/copy-unload-iam-role.html) en la *Guía de administración de Amazon Redshift*. 

## Paso 1: Crear tablas y cargar datos de prueba
<a name="spatial-tutorial-test-data"></a>

Los datos de origen que se utilizaron en este se encuentran en archivos denominados `accommodations.csv` y `zipcodes.csv`. 

El archivo `accommodations.csv` consiste en datos de código abierto de insideairbnb.com. El archivo `zipcodes.csv` proporciona códigos postales que son datos de código abierto del Instituto Nacional de Estadística de Berlín-Brandeburgo en Alemania (Amt für Statistik Berlín-Brandenburg). Ambos orígenes de datos se proporcionan bajo una licencia de Creative Commons. Los datos se limitan a la región de Berlín, Alemania. Estos archivos se encuentran en un bucket público de Amazon S3 para utilizarse en este tutorial. 

De manera opcional, puede descargar los datos de origen desde los siguientes enlaces de Amazon S3:
+ [ Datos de origen para la tabla `accommodations`](https://s3.amazonaws.com/redshift-downloads/spatial-data/accommodations.csv). 
+ [ Datos de origen para la tabla `zipcode`](https://s3.amazonaws.com/redshift-downloads/spatial-data/zipcode.csv). 

Utilice el siguiente procedimiento para crear tablas y cargar datos de prueba. 

**Para crear tablas y cargar datos de prueba**

1. Abra el editor de consultas de Amazon Redshift. Para obtener más información acerca de cómo trabajar con el editor de consultas, visite [Consulta de una base de datos mediante el editor de consultas](https://docs.aws.amazon.com/redshift/latest/mgmt/query-editor.html) en la *Guía de administración de Amazon Redshift*. 

1. Elimine todas las tablas utilizadas en este tutorial si ya existen en la base de datos. Para obtener más información, consulte [Paso 3: Eliminar los recursos](#spatial-tutorial-clean-up). 

1. Cree la tabla `accommodations` para almacenar la ubicación geográfica de cada alojamiento (longitud y latitud), el nombre del listado y otros datos comerciales. 

   En este tutorial, se analiza el alquiler de habitaciones en Berlín, Alemania. En la columna `shape`, se almacenan los puntos geográficos de la ubicación de los alojamientos. Las otras columnas contienen información sobre el alquiler. 

   Para crear la tabla `accommodations`, ejecute la siguiente instrucción SQL en el editor de consultas de 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
   );
   ```

1. Cree la tabla `zipcode` en el editor de consultas para almacenar los códigos postales de Berlín. 

   Un *código postal* se define como un polígono en la columna `wkb_geometry`. En el resto de las columnas, se describen metadatos espaciales adicionales sobre el código postal. 

   Para crear la tabla `zipcode`, ejecute la siguiente instrucción SQL en el editor de consultas de 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)
    );
   ```

1. Cargue las tablas con datos de muestra. 

   Los datos de muestra para este tutorial se encuentran en un bucket de Amazon S3 que permite el acceso de lectura a todos los usuarios de AWS autenticados. Asegúrese de proporcionar credenciales de AWS válidas que permiten el acceso a Amazon S3. 

   Para cargar datos de prueba en las tablas, ejecute los siguientes comandos COPY. Sustituya *`account-number`* por su número de cuenta de AWS. El segmento de la cadena de credenciales que está delimitado entre comillas simples no debe contener espacios ni saltos de línea. 

   ```
   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';
   ```

1. Ejecute los siguientes comandos para comprobar que cada tabla se haya cargado de forma correcta. 

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

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

   Los siguientes resultados muestran la cantidad de filas en cada tabla de los datos de prueba.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/redshift/latest/dg/spatial-tutorial.html)

## Paso 2: Consultar los datos espaciales
<a name="spatial-tutorial-query"></a>

Después de crear y cargar las tablas, puede consultarlas mediante las instrucciones SQL SELECT. Las siguientes consultas muestran parte de la información que se puede recuperar. Puede escribir muchas otras consultas que utilizan funciones espaciales para satisfacer sus necesidades. 

**Para consultar los datos espaciales**

1. Realice una consulta para obtener el recuento de la cantidad total de listados almacenados en la tabla `accommodations`, como se muestra a continuación. El sistema de referencia espacial es el sistema geodésico mundial (WGS) 84, que tiene el identificador de referencia espacial único 4326.

   ```
   SELECT count(*) FROM public.accommodations WHERE ST_SRID(shape) = 4326;
   ```

   ```
    count
   -------
    22248
   ```

1. Recupere los objetos de geometría en formato de texto conocido (WKT) con algunos atributos adicionales. Además, puede comprobar si estos datos de código postal también se almacenan con el sistema geodésico mundial (WGS) 84, que utiliza el ID de referencia espacial (SRID) 4326. Los datos espaciales deben almacenarse en el mismo sistema de referencia espacial para que sean interoperables. 

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

1. Seleccione el polígono de Berlin-Mitte (10117), un distrito de Berlín, en formato GeoJSON, su dimensión y la cantidad de puntos en este 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
   ```

1. Ejecute el siguiente comando SQL para ver cuántos alojamientos hay a menos de 500 metros de la Puerta de Brandenburgo. 

   ```
   SELECT count(*) 
   FROM public.accommodations 
   WHERE ST_DistanceSphere(shape, ST_GeomFromText('POINT(13.377704 52.516431)', 4326)) < 500;
   ```

   ```
   count
   ------
     29
   ```

1. Obtenga la ubicación aproximada de la Puerta de Brandenburgo a partir de los datos almacenados en los alojamientos que se mencionan como cercanos mediante la ejecución de la siguiente consulta.

   Esta consulta requiere una subselección. Esto implica un recuento diferente, ya que la ubicación solicitada no es la misma que la consulta anterior porque está más cerca de los alojamientos. 

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

1. Ejecute la siguiente consulta para mostrar los detalles de todos los alojamientos en los alrededores de la Puerta de Brandenburgo, ordenados por precio en orden descendente. 

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

1. Ejecute la siguiente consulta para recuperar el alojamiento más costoso con su 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,...
   ```

1. Calcule el precio máximo, mínimo o medio de los alojamientos con una subconsulta. 

   Con la siguiente consulta, se muestra el precio medio de los alojamientos 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)
   ```

1. Ejecute la siguiente consulta para recuperar la cantidad de alojamientos que se muestran para Berlín. Los puntos calientes se agrupan por código postal y se ordenan por la cantidad de suministro, por lo que pueden encontrarse de esta manera. 

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

## Paso 3: Eliminar los recursos
<a name="spatial-tutorial-clean-up"></a>

El clúster seguirá acumulando cargos mientras esté en ejecución. Una vez que haya completado este tutorial, puede eliminar el clúster de muestra. 

Si desea mantener el clúster, pero quiere recuperar el almacenamiento utilizado por las tablas de datos de prueba, ejecute los siguientes comandos para eliminar las tablas. 

```
drop table public.accommodations cascade;
```

```
drop table public.zipcode cascade;
```