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
yNAME
, pero la tablecounties
de ejemplo solo utiliza dos:Name
(cadena) yBoundaryShape
(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://amzn-s3-demo-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://amzn-s3-demo-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.
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
Para obtener más ejemplos de consultas geoespaciales, consulte estas publicaciones de blog: