예제: 지리 공간 쿼리 - Amazon Athena

예제: 지리 공간 쿼리

이 주제의 예제에서는 GitHub에서 사용 가능한 샘플 데이터에서 두 개의 테이블을 생성하고 데이터를 기반으로 테이블을 쿼리합니다. 샘플 데이터는 단지 설명을 위한 것이며 정확하지 않을 수 있으며 다음 파일에 있습니다.

  • earthquakes.csv – 캘리포니아에서 발생한 지진이 수록되어 있습니다. 예제 earthquakes 테이블에서는 이 데이터의 필드를 사용합니다.

  • california-counties.jsonESRI 호환 GeoJSON 형식으로 캘리포니아 주의 카운티 데이터가 수록되어 있습니다. 데이터에는 AREA, PERIMETER, STATE, COUNTYNAME 같은 여러 필드가 포함되어 있지만 예제 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://DOC-EXAMPLE-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://DOC-EXAMPLE-BUCKET/my-query-log/json/';

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

참고

Athena 엔진 버전 2부터 ST_CONTAINS와 같은 함수에서는 더는 VARBINARY 유형을 입력으로 지원하지 않습니다. 이러한 이유로 이 예제에서는 ST_GeomFromLegacyBinary(varbinary) 함수를 사용하여 boundaryshape 이진 값을 geometry로 변환합니다. 자세한 내용은 Athena 엔진 버전 2 참조의 지리 공간 함수 변경 사항 단원을 참조하세요.

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

추가적인 리소스

지리 공간 쿼리에 대한 추가 예제는 다음 블로그 게시물을 참조하세요.