

# 예제: 지리 공간 쿼리
<a name="geospatial-example-queries"></a>

이 주제의 예제에서는 GitHub에서 사용 가능한 샘플 데이터에서 두 개의 테이블을 생성하고 데이터를 기반으로 테이블을 쿼리합니다. 샘플 데이터는 단지 설명을 위한 것이며 정확하지 않을 수 있으며 다음 파일에 있습니다.
+ **[https://github.com/Esri/gis-tools-for-hadoop/blob/master/samples/data/earthquake-data/earthquakes.csv](https://github.com/Esri/gis-tools-for-hadoop/blob/master/samples/data/earthquake-data/earthquakes.csv)** – 캘리포니아에서 발생한 지진이 수록되어 있습니다. 예제 `earthquakes` 테이블에서는 이 데이터의 필드를 사용합니다.
+ **[https://github.com/Esri/gis-tools-for-hadoop/blob/master/samples/data/counties-data/california-counties.json](https://github.com/Esri/gis-tools-for-hadoop/blob/master/samples/data/counties-data/california-counties.json)** – [ESRI 호환 GeoJSON 형식](https://doc.arcgis.com/en/arcgis-online/reference/geojson.htm)으로 캘리포니아 주의 카운티 데이터가 수록되어 있습니다. 데이터에는 `AREA`, `PERIMETER`, `STATE`, `COUNTY` 및 `NAME` 같은 여러 필드가 포함되어 있지만 예제 `counties` 테이블에서는 `Name`(문자열) 및 `BoundaryShape`(이진) 두 개만 사용합니다.
**참고**  
Athena는 `com.esri.json.hadoop.EnclosedEsriJsonInputFormat`을 사용하여 JSON 데이터를 지리 공간 이진 형식으로 변환합니다.

다음 코드 예제는 `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/';
```

다음 코드 예제는 `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/';
```

다음 쿼리 예제는 `counties` 및 `earthquake` 테이블에 `CROSS JOIN` 함수를 사용합니다. 이 예제에서는 `ST_CONTAINS`를 사용하여 경계에 지진 장소(`ST_POINT`로 지정됨)가 포함된 카운티를 쿼리합니다. 쿼리는 해당 카운티를 이름별로 그룹화하고 개수별로 정렬한 다음 내림차순으로 반환합니다.

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

이 쿼리가 반환하는 값:

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

## 추가 리소스
<a name="geospatial-example-queries-additional-resources"></a>

지리 공간 쿼리에 대한 추가 예제는 다음 블로그 게시물을 참조하세요.
+ [Extend geospatial queries in Amazon Athena with UDFs and AWS Lambda](https://aws.amazon.com/blogs/big-data/extend-geospatial-queries-in-amazon-athena-with-udfs-and-aws-lambda/) 
+ [Visualize over 200 years of global climate data using Amazon Athena and Amazon Quick](https://aws.amazon.com/blogs/big-data/visualize-over-200-years-of-global-climate-data-using-amazon-athena-and-amazon-quicksight/).
+ [Amazon Athena로 OpenStreetMap 쿼리](https://aws.amazon.com/blogs/big-data/querying-openstreetmap-with-amazon-athena/)