뷰 작업 - Amazon Athena

뷰 작업

Amazon Athena의 뷰는 물리적 테이블이 아니라 논리적 테이블입니다. 뷰를 정의하는 쿼리는 쿼리에서 해당 뷰가 참조될 때마다 실행됩니다.

SELECT 쿼리에서 뷰를 생성한 후 향후 쿼리에 이 뷰를 참조할 수 있습니다. 자세한 내용은 CREATE VIEW 단원을 참조하세요.

뷰를 사용해야 하는 경우

뷰를 생성하여 다음을 수행할 수 있습니다.

  • 데이터 하위 집합을 쿼리합니다. 예를 들어 원본 테이블에서 열 하위 집합이 있는 뷰를 만들어 데이터 쿼리를 간소화할 수 있습니다.

  • 여러 테이블을 쿼리 하나에 결합합니다. 테이블이 여러 개 있고 UNION ALL로 테이블을 결합하려는 경우 해당 표현식으로 뷰를 생성하여 결합된 테이블에 대한 쿼리를 간소화할 수 있습니다.

  • 기존 기본 쿼리의 복잡성을 숨기고 사용자의 쿼리 실행을 간소화합니다. 기본 쿼리에는 보통 쿼리 이해 및 디버깅을 어렵게 하는 테이블 사이의 조인, 열 목록의 표현식, 여러 SQL 구문이 포함됩니다. 복잡성을 숨기고 쿼리를 간소화하는 뷰를 생성할 수 있습니다.

  • 최적화 기술을 사용하여 실험하고 최적화된 쿼리를 생성합니다. 예를 들어 최고의 성능을 입증하는 WHERE 조건, JOIN 명령 또는 여러 표현식의 조합을 찾은 경우, 이러한 절과 표현식을 사용하여 뷰를 생성할 수 있습니다. 그러면 애플리케이션이 이 뷰에 대해 비교적 간단한 쿼리를 만들 수 있습니다. 원래 쿼리를 최적화할 더 좋은 방법을 나중에 찾은 경우, 뷰를 다시 생성할 때 모든 애플리케이션이 최적화된 기본 쿼리의 이점을 즉시 활용합니다.

  • 기본 테이블 및 열 이름이 변경된 경우 그러한 이름을 숨기고, 유지 관리 문제를 최소화합니다. 이 경우 새 이름을 사용하여 뷰를 다시 생성합니다. 기본 테이블 대신 뷰를 사용하는 모든 쿼리는 아무런 변경 없이 계속 실행됩니다.

Athena의 뷰에 대해 지원되는 작업

Athena는 뷰에 대해 다음 작업을 지원합니다. 쿼리 편집기에서 다음 명령을 실행할 수 있습니다.

설명
CREATE VIEW

지정된 SELECT 쿼리에서 새 뷰를 생성합니다. 자세한 내용은 뷰 생성 단원을 참조하세요.

선택적 OR REPLACE 절을 사용하여 기존 뷰를 바꿔 업데이트할 수 있습니다.

DESCRIBE VIEW

명명된 뷰의 열 목록을 보여 줍니다. 이를 통해 복잡한 뷰의 속성을 검사할 수 있습니다.

DROP VIEW

기존 뷰를 삭제합니다. 뷰가 없는 경우 선택적 IF EXISTS 절이 오류를 억제합니다.

SHOW CREATE VIEW

지정된 뷰를 생성하는 SQL 문을 보여 줍니다.

SHOW VIEWS

지정된 데이터베이스 또는 현재 데이터베이스(데이터베이스 이름이 생략된 경우)의 뷰를 나열합니다. 선택적 LIKE 절을 정규식과 함께 사용하여 뷰 이름 목록을 제한합니다. 콘솔의 왼쪽 창에서 뷰 목록을 볼 수도 있습니다.

SHOW COLUMNS

뷰에 대한 스키마에 열을 나열합니다.

뷰 고려 사항

다음 고려 사항은 Athena에서 뷰를 생성하고 사용하는 데 적용됩니다.

  • Athena에서 Athena 콘솔, AWS Glue Data Catalog(이를 사용하도록 마이그레이션한 경우) 또는 동일한 카탈로그에 연결된 Amazon EMR 클러스터에서 실행되는 Presto를 사용하여 생성된 뷰를 미리 보고 작업할 수 있습니다. 다른 방법으로 생성된 Athena 뷰는 미리 보거나 추가할 수 없습니다.

  • AWS GlueData Catalog를 통해 보기를 생성하는 경우 PartitionKeys 파라미터를 포함시키고 "PartitionKeys":[]와 같이 해당 값을 빈 목록으로 설정해야 합니다. 그렇지 않으면 Athena에서 뷰 쿼리가 실패합니다. 다음 예제에서는 "PartitionKeys":[]를 사용하여 Data Catalog에서 생성된 뷰를 보여 줍니다.

    aws glue create-table --database-name mydb --table-input '{ "Name":"test", "TableType": "EXTERNAL_TABLE", "Owner": "hadoop", "StorageDescriptor":{ "Columns":[{ "Name":"a","Type":"string"},{"Name":"b","Type":"string"}], "Location":"s3://xxxxx/Oct2018/25Oct2018/", "InputFormat":"org.apache.hadoop.mapred.TextInputFormat", "OutputFormat": "org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat", "SerdeInfo":{"SerializationLibrary":"org.apache.hadoop.hive.serde2.OpenCSVSerde", "Parameters":{"separatorChar": "|", "serialization.format": "1"}}},"PartitionKeys":[]}'
  • Data Catalog에서 Athena 뷰를 생성한 경우, Data Catalog가 뷰를 테이블로 처리합니다. Data Catalog에서 테이블 수준 세분화된 액세스 제어를 사용하여 이러한 뷰에 대한 액세스를 제한할 수 있습니다.

  • Athena는 재귀 뷰를 실행하지 못하도록 하고 그러한 경우 오류 메시지를 표시합니다. 재귀 뷰는 자체를 참조하는 뷰 쿼리입니다.

  • Athena는 기한 경과 뷰를 감지하면 오류 메시지를 표시합니다. 다음 중 하나가 발생하면 기한 경과 뷰가 보고됩니다.

    • 뷰가 존재하지 않는 테이블 또는 데이터베이스를 참조합니다.

    • 스키마 또는 메타데이터 변경이 참조된 테이블에서 이루어집니다.

    • 참조된 테이블이 삭제되고 다른 스키마 또는 구성으로 재생성됩니다.

  • 중첩 뷰 뒤의 쿼리가 유효하고 테이블과 데이터베이스가 있는 한 중첩 뷰를 만들고 실행할 수 있습니다.

뷰 제한 사항

  • Athena 뷰 이름에는 밑줄 (_) 이외의 특수 문자를 사용할 수 없습니다. 자세한 내용은 테이블, 데이터베이스 및 열의 이름 단원을 참조하세요.

  • 뷰 이름을 지정하는 데 예약어를 사용하지 마세요. 예약어를 사용하는 경우에는 뷰에 대한 쿼리에서 큰 따옴표를 사용하여 예약어를 묶습니다. 예약어 섹션을 참조하세요.

  • 외부 Hive 메타스토어 또는 UDF를 통해 Athena에서 생성된 보기를 사용할 수 없습니다. 외부 Hive에서 작성된 뷰 작업에 대한 자세한 내용은 Hive 뷰 작업을 참조하세요.

  • 지리 공간 함수에 뷰를 사용할 수 없습니다.

  • 뷰를 사용하여 Amazon S3의 데이터에 대한 액세스 제어를 관리할 수 없습니다. 뷰를 쿼리하려면 Amazon S3에 저장된 데이터에 액세스할 수 있는 권한이 필요합니다. 자세한 내용은 Amazon S3에 액세스 단원을 참조하십시오.

  • 여러 계정에서 보기를 쿼리하는 작업은 Athena 엔진 버전 2와 Athena 엔진 버전 3에서 모두 지원되지만 크로스 계정 AWS Glue Data Catalog를 포함하는 보기는 생성할 수 없습니다. 교차 계정 데이터 카탈로그 액세스에 관한 자세한 내용은 AWS Glue 데이터 카탈로그에 대한 교차 계정 액세스를 참조하세요.

  • Athena에서는 Hive 또는 Iceberg의 숨겨진 메타데이터 열 $bucket, $file_modified_time, $file_size$partition을 보기에서 지원하지 않습니다. Athena에서 $path 메타데이터 열 사용에 대한 자세한 내용은 Amazon S3의 소스 데이터에 대한 파일 위치 가져오기 섹션을 참조하세요.

콘솔에서 뷰 관련 작업

Athena 콘솔에서 다음을 수행할 수 있습니다.

  • 테이블이 나열된 왼쪽 창에서 모든 뷰를 찾을 수 있습니다.

  • 뷰를 필터링합니다.

  • 뷰를 미리 보거나, 속성을 표시, 편집 또는 삭제합니다.

뷰에 대한 작업 표시

뷰를 이미 생성한 경우에만 콘솔에 뷰가 나타납니다.

  1. Athena 콘솔에서 뷰(Views)를 선택한 다음 확장하면 뷰(Views) 아래 여러 열이 표시됩니다.

  2. 뷰 옆에 있는 3개의 세로 점을 선택하여 뷰에 대한 작업 목록을 표시합니다.

    
                        뷰에 대한 작업 메뉴
  3. 뷰를 미리 보거나, 뷰 이름을 쿼리 편집기에 삽입하거나, 뷰를 삭제하거나, 뷰의 속성을 보거나, 쿼리 편집기에서 뷰를 표시하고 편집하는 작업을 선택합니다.

뷰 생성

템플릿을 사용하거나 기존 쿼리를 실행하여 Athena 콘솔에서 뷰를 생성할 수 있습니다.

템플릿을 사용하여 뷰 생성
  1. Athena 콘솔에서 테이블 및 뷰(Tables and views) 옆에 있는 생성(Create)을 선택한 다음 뷰 생성(Create view)을 선택합니다.

    
                        뷰 생성.

    이 작업은 편집 가능한 뷰 템플릿을 쿼리 편집기에 배치합니다.

  2. 요구 사항에 따라 뷰 템플릿을 편집합니다. 문에 뷰 이름을 입력할 때 뷰 이름에 밑줄(_) 이외의 특수 문자를 사용할 수 없습니다. 테이블, 데이터베이스 및 열의 이름 섹션을 참조하세요. 뷰 이름을 지정하는데 예약어를 사용하지 마세요.

    뷰 생성에 대한 자세한 내용은 CREATE VIEW뷰 예제 섹션을 참조하세요.

  3. 실행(Run)을 선택하여 뷰를 생성합니다. 뷰가 Athena 콘솔의 뷰 목록에 나타납니다.

기존 쿼리에서 뷰 생성
  1. Athena 쿼리 편집기를 사용하여 기존 쿼리를 실행합니다.

  2. 쿼리 편집기 창에서 생성(Create)을 선택한 다음 쿼리에서 뷰(View from query)를 선택합니다.

    
                        생성(Create), 쿼리에서 뷰(View from query)를 선택합니다.
  3. 뷰 생성(Create View) 대화 상자에서 뷰 이름을 입력하고 생성(Create)을 선택합니다. 뷰 이름에는 밑줄 (_) 이외의 특수 문자를 사용할 수 없습니다. 테이블, 데이터베이스 및 열의 이름 섹션을 참조하세요. 뷰 이름을 지정하는데 예약어를 사용하지 마세요.

    Athena는 콘솔의 뷰 목록에 뷰를 추가하고 쿼리 편집기에 뷰에 대한 CREATE VIEW 문을 표시합니다.

참고
  • 테이블의 기반이 되는 테이블을 삭제한 다음 뷰를 실행하려고 하면 Athena에서 오류 메시지를 표시합니다.

  • 기존 뷰의 위에 있는 뷰인 중첩 뷰(nested view)를 생성할 수 있습니다. Athena는 자신을 참조하는 재귀 뷰가 실행되지 않도록 방지합니다.

뷰 예제

뷰 쿼리 구문을 표시하려면 SHOW CREATE VIEW를 사용합니다.

예 1

idname이라는 열 2개가 있는 employees 테이블과, idsalary라는 열 2개가 있는 salaries 테이블을 가정하겠습니다.

이 예에서는 테이블 employeessalaries에서 급여에 매핑된 ID 목록을 가져오는 SELECT 쿼리로 name_salary라는 뷰를 생성합니다.

CREATE VIEW name_salary AS SELECT employees.name, salaries.salary FROM employees, salaries WHERE employees.id = salaries.id
예제 2

다음 예에서는 더 복잡한 쿼리 구문을 숨길 수 있는 view1이라는 뷰를 생성합니다.

이 뷰는 table1table2라는 테이블 2개 위에서 실행되며, 각 테이블은 다른 SELECT 쿼리입니다. 이 뷰는 table1에서 열을 선택하고 table2로 결과를 조인합니다. 이 조인은 두 테이블에 있는 a 열을 기반으로 합니다.

CREATE VIEW view1 AS WITH table1 AS ( SELECT a, MAX(b) AS the_max FROM x GROUP BY a ), table2 AS ( SELECT a, AVG(d) AS the_avg FROM y GROUP BY a) SELECT table1.a, table1.the_max, table2.the_avg FROM table1 JOIN table2 ON table1.a = table2.a;

페더레이션된 보기 쿼리에 대한 자세한 내용은 페더레이션된 보기 쿼리 섹션을 참조하세요.