내용으로 건너뛰기

Amazon Athena에서 파티션 프로젝션 문제를 해결하려면 어떻게 해야 합니까?

4분 분량
0

Amazon Athena에서 파티션 프로젝션 문제를 해결하려고 합니다.

간략한 설명

파티션 프로젝션과 관련된 문제는 storage.location.template을 Amazon Simple Storage Service(Amazon S3) 디렉터리 구조와 일치시키는 것과 관련이 있을 수 있습니다. 열이 파티션 열로 정의된 경우에는 storage.location.template에서의 위치 및 해당 열에 대한 프로젝션 구성이 필요합니다. storage.location.template을 생성하면 파티션 값이 템플릿에 프로젝션되어 데이터의 Amazon S3 경로를 가져옵니다. 템플릿이 디렉터리와 일치하지 않거나 프로젝션 구성이 누락된 경우 문제가 발생합니다.

다음 시나리오를 기반으로 Athena에서 파티션 프로젝션과 관련된 문제를 해결하십시오.

  • Athena 테이블이 파티션 프로젝션을 설정했지만 테이블을 쿼리해도 결과가 없습니다.
  • Athena 테이블이 파티션 프로젝션을 설정했지만 쿼리가 INVALID_TABLE_PROPERTY: The 'storage.location.template' table property must contain templates for all partition columns! 오류로 실패합니다.
  • Athena 테이블이 파티션 프로젝션을 설정했지만 쿼리가 INVALID_TABLE_PROPERTY: Table (table-name) is configured for partition projection, but the following partition columns are missing projection configuration: (partition-column-name) 오류로 실패합니다.
  • Athena 테이블에는 Hive 스타일 파티셔닝이 있지만 파티션을 로드하는 대신 파티션 프로젝션을 사용하여 테이블을 쿼리하려고 합니다.

해결 방법

Athena 테이블이 파티션 프로젝션을 설정했지만 테이블을 쿼리해도 결과가 없습니다.

이 시나리오의 문제를 해결하려면 다음 작업을 수행하십시오.

파티션 프로젝션을 설정하고 테이블 파라미터를 확인합니다. projection.enabledtrue여야 합니다. 테이블의 각 파티션 열에 대해 projection.columnName.typeenum, integer, date 또는 injected로 설정합니다.

  • 프로젝션 유형이 date인 경우 열 유형을 **String(문자열)**으로 설정합니다. 파티션 키의 날짜 유형으로 **String(문자열)**을 사용하십시오. 자세한 내용은 Amazon Athena의 데이터 유형을 참조하십시오.
  • 프로젝션 유형이 date인 경우 projection.columnName.rangeprojection.columnName.format을 사용합니다. projection.columnName.format은 Amazon S3 경로에서 데이터가 구성되는 방법과 일치해야 합니다. 또한 필요에 따라 projection.columnName.intervalprojection.columnName.range를 사용하십시오. 자세한 내용은 날짜 유형을 참조하십시오.
  • 프로젝션 유형이 enum인 경우 projection.columnName.values를 해당 파티션 열의 모든 잠재적 값 목록으로 설정합니다.
  • 프로젝션 유형이 integer인 경우 projection.columnName.range를 해당 열의 잠재적 값 범위로 설정합니다. 또한 필요에 따라 projection.columnName.intervalprojection.columnName.digits를 사용하십시오. 자세한 내용은 정수 유형을 참조하십시오.
  • injected 유형인 열의 경우 쿼리에 각 열에 대한 WHERE <injected_col> 등과 같은 필터 표현식이 있어야 합니다. 또한 injected 열의 파티션 열 정의에서 String(문자열) 열 유형을 사용하십시오.

storage.location.template에 모든 파티션 열에 대한 자리 표시자가 있고 버킷의 Amazon S3 디렉터리 구조와 일치하는지 확인하십시오. 예를 들어 AWS CloudTrail 로그는 파티션 프로젝션을 사용할 수 있습니다.

참고: 기본적으로 AWS 리전 및 계정 ID는 프로젝션되지 않습니다. 자세한 내용은 파티션 프로젝션을 사용하여 Anthena에서 CloudTrail 로그에 대한 테이블 생성을 참조하십시오.

CloudTrail 로그로 리전 및 계정 ID를 프로젝션하려면 다음 템플릿을 사용하십시오. enum 유형을 사용하고 모든 리전 및 계정 ID를 열거해야 합니다.

참고: example-bucket을 필요한 Amazon S3 버킷으로 바꾸십시오. region, timestamp,account 필드가 프로젝션됩니다.

'storage.location.template'='s3://<example-bucket>/AWSLogs/${account}/CloudTrail/${region}/${timestamp}'

Athena 테이블을 쿼리하여 특정 Amazon S3 경로의 데이터를 찾으려면 다음 명령을 실행합니다.

참고: example-YYYY/MM/DD를 원하는 타임스탬프로 바꾸고 example-account-ID를 필요한 계정 ID로 바꾸고 example-region을 필요한 리전으로 바꾸십시오.

SELECT * FROM cloudtrail_logs_pp WHERE timestamp='YYYY/MM/DD' AND account=example-account-ID AND region=example-region

예제 파티션:

s3://bucket/AWSLogs/example-account-ID/CloudTrail/example-region/YYYY/MM/DD

Athena 테이블이 파티션 프로젝션을 설정했지만 쿼리가 INVALID_TABLE_PROPERTY: The 'storage.location.template' table property must contain templates for all partition columns! 오류로 실패합니다.

이 오류가 발생하면 storage.location.template에서 파티션 열 자리 표시자가 누락됩니다. 이 문제를 해결하기 위해서는 PARTITIONED BY 절의 각 열에 자리 표시자가 있어야 합니다.

Athena 테이블이 파티션 프로젝션을 설정했지만 쿼리가 INVALID_TABLE_PROPERTY: Table (table-name) is configured for partition projection, but the following partition columns are missing projection configuration: (partition-column-name) 오류로 실패합니다.

이 오류가 발생하면 PARTITIONED BY 절에 의해 정의된 열에서 프로젝션에 필요한 테이블 파라미터(예: projection.columnName.format)가 누락됩니다. 이 문제를 해결하려면 다음과 같이 테이블 파라미터를 확인하십시오.

  • 프로젝션 유형이 date인 경우 projection.columnName.rangeprojection.columnName.format을 사용합니다. projection.columnName.format은 Amazon S3 경로에서 데이터가 구성되는 방법과 일치해야 합니다. 또한 필요에 따라 projection.columnName.intervalprojection.columnName.range를 사용하십시오. 자세한 내용은 날짜 유형을 참조하십시오.
  • 프로젝션 유형이 enum인 경우 projection.columnName.values를 해당 파티션 열의 모든 잠재적 값 목록으로 설정합니다.
  • 프로젝션 유형이 integer인 경우 projection.columnName.range를 해당 열의 잠재적 값 범위로 설정합니다. 또한 필요에 따라 projection.columnName.intervalprojection.columnName.digits를 사용하십시오. 자세한 내용은 정수 유형을 참조하십시오.
  • injected 유형인 열의 경우 쿼리에 각 injected 열에 대한 필터 표현식이 있어야 합니다. 또한 injected 열의 PARTITIONED BY 절에서 String(문자열) 열 유형을 사용하십시오.

Athena 테이블에는 Hive 스타일 파티셔닝이 있지만 파티션을 로드하는 대신 파티션 프로젝션을 사용하여 테이블을 쿼리하려고 합니다.

Athena 테이블에 Hive 스타일 파티셔닝이 있지만 파티션 프로젝션을 사용하려는 경우 스토리지 템플릿과 프로젝션 형식을 확인합니다. 스토리지 템플릿 및 프로젝션 형식에는 Amazon S3 경로의 partition_col_name= 부분이 포함되어야 합니다. 다음 명령을 실행하십시오.

참고: example-table-name을 필요한 테이블 이름으로 바꾸십시오.

CREATE EXTERNAL TABLE <example-table-name> (
col1 int,
col2 int
)
PARTITIONED BY
partition_col_name STRING
)
ROW FORMAT DELIMITED
LOCATION
's3://bucket/prefix/'
TBLPROPERTIES (
  'projection.enabled'='true',
  'projection.partition_col_name.type'='<enum,date,etc>',
  ... ##Omitting type-based projection parameters
  'storage.location.template'='s3://bucket/prefix/partition_col_name={partition_col_name}/')

Hive 스타일 파티션이 여러 개 있고 이를 프로젝션된 단일 파티션 열에 매핑하려면 열 형식을 변경하십시오. Amazon S3 데이터를 쿼리하여 date라는 단일 파티션 열이 있도록 하려면 다음 명령을 실행합니다.

참고: example-table-name을 필요한 테이블 이름으로 바꾸십시오.

CREATE EXTERNAL TABLE <example-table-name> (col1 int, col2 int)
PARTITIONED BY (
`date` STRING
)
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
LOCATION "s3://bucket/prefix/"
TBLPROPERTIES (
  'projection.enabled'='true',
  'projection.date.type'='date',
  'projection.date.format'='\'year=\'yyyy/\'month=\'MM/\'day=\'dd',
  'projection.date.range'='year=2023/month=01/day=01,year=2023/month=12/day=31',
  'storage.location.template' = 's3://bucket/prefix/${date}/')

Amazon S3 경로 예:

s3://bucket/prefix/year=/month=/day=/
AWS 공식업데이트됨 2년 전