Ejemplos: consultas geoespaciales - Amazon Athena

Ejemplos: consultas geoespaciales

Los ejemplos de este tema crean dos tablas a partir de datos de ejemplo disponibles en GitHub y consultan las tablas en función de los datos. Los datos de ejemplo, que son solo para fines ilustrativos y no se garantiza que sean exactos, se encuentran en los siguientes archivos:

  • earthquakes.csv: enumera los terremotos que se han producido en California. La tabla de ejemplo earthquakes utiliza campos de estos datos.

  • california-counties.json: enumera los datos del condado para el estado de California en formato GeoJSON compatible con ESRI. Los datos incluyen muchos campos tales como AREA, PERIMETER, STATE, COUNTY y NAME, pero la table counties de ejemplo solo utiliza dos: Name (cadena) y BoundaryShape (binario).

    nota

    Athena utiliza el com.esri.json.hadoop.EnclosedEsriJsonInputFormat para convertir los datos JSON a formato binario geoespacial.

El siguiente ejemplo de código crea una tabla llamada earthquakes:

CREATE external TABLE earthquakes ( earthquake_date string, latitude double, longitude double, depth double, magnitude double, magtype string, mbstations string, gap string, distance string, rms string, source string, eventid string ) ROW FORMAT DELIMITED FIELDS TERMINATED BY ',' STORED AS TEXTFILE LOCATION 's3://DOC-EXAMPLE-BUCKET/my-query-log/csv/';

El siguiente ejemplo de código crea una tabla llamada counties:

CREATE external TABLE IF NOT EXISTS counties ( Name string, BoundaryShape binary ) ROW FORMAT SERDE 'com.esri.hadoop.hive.serde.EsriJsonSerDe' STORED AS INPUTFORMAT 'com.esri.json.hadoop.EnclosedEsriJsonInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://DOC-EXAMPLE-BUCKET/my-query-log/json/';

La siguiente consulta de ejemplo utiliza la función CROSS JOIN en las tablas counties y earthquake. En el ejemplo se utiliza ST_CONTAINS para consultar los condados cuyos límites incluyen ubicaciones de terremotos, que se especifican con ST_POINT. La consulta agrupa los condados por su nombre, los ordena por su número y los devuelve en orden descendente.

nota

Desde la versión 2 del motor Athena, funciones como ST_CONTAINS ya no son compatibles con el tipo VARBINARY como entrada. Por este motivo, el ejemplo utiliza la función ST_GeomFromLegacyBinary(varbinary) para convertir el valor binario boundaryshape en una geometría. Para obtener más información consulte Cambios en las funciones geoespaciales en la Referencia Versión 2 del motor Athena.

SELECT counties.name, COUNT(*) cnt FROM counties CROSS JOIN earthquakes WHERE ST_CONTAINS (ST_GeomFromLegacyBinary(counties.boundaryshape), ST_POINT(earthquakes.longitude, earthquakes.latitude)) GROUP BY counties.name ORDER BY cnt DESC

Esta consulta devuelve:

+------------------------+ | name | cnt | +------------------------+ | Kern | 36 | +------------------------+ | San Bernardino | 35 | +------------------------+ | Imperial | 28 | +------------------------+ | Inyo | 20 | +------------------------+ | Los Angeles | 18 | +------------------------+ | Riverside | 14 | +------------------------+ | Monterey | 14 | +------------------------+ | Santa Clara | 12 | +------------------------+ | San Benito | 11 | +------------------------+ | Fresno | 11 | +------------------------+ | San Diego | 7 | +------------------------+ | Santa Cruz | 5 | +------------------------+ | Ventura | 3 | +------------------------+ | San Luis Obispo | 3 | +------------------------+ | Orange | 2 | +------------------------+ | San Mateo | 1 | +------------------------+

Recursos adicionales de

Para obtener más ejemplos de consultas geoespaciales, consulte estas publicaciones de blog: