View a markdown version of this page

스키마 중첩 해제 - AWS Glue

스키마 중첩 해제

제로 ETL을 통해 분석 서비스와 통합할 때 대상 테이블에 중첩 구조가 표시되는 방식을 선택할 수 있습니다. AWS Glue 제로 ETL은 복잡한 데이터 구조를 분석에 더 적합한 형식으로 평면화하기 위해 스키마 중첩 해제 옵션을 제공합니다.

중첩 해제 옵션

소스와 제로 ETL 통합을 생성할 때 다음의 중첩 해제 옵션 중에서 선택할 수 있습니다. 이러한 옵션은 CreateIntegrationTableProperty API를 호출할 때 사용하는 특정 열거 값에 해당합니다. 모든 중첩 해제 옵션의 경우 가장 안쪽 계층까지 이동하고 최선의 노력을 기울여 DDB 유형을 대상 spark/iceberg 프리미티브 유형에 매핑합니다. 소스 DDB와 대상 테이블 간의 유형 매핑은 아래와 같습니다.

DDB 소스 데이터 형식대상 테이블 데이터 형식
"S"StringType
"B"BinaryType
"N"DoubleType
"BOOL"BooleanType
"SS"ArrayType(StringType)
"NS"ArrayType(DoubleType)
"BS"ArrayType(BinaryType)
"L"ArrayType(StringType)
"NULL"무시
"M"StructType(TOP/NOUNNEST)
중첩 해제 없음 - NO_UNNEST

API 값: NO_UNNEST

Amazon DynamoDB 항목의 원래 중첩 구조를 보존합니다. 맵 및 목록은 대상에 구조화된 열로 저장됩니다.

최적의 용도: 분석 도구가 중첩된 데이터를 처리할 수 있는 경우 Amazon DynamoDB 데이터의 정확한 구조를 보존하는 데 가장 적합합니다.

최상위 수준 - TOP_LEVEL

API 값: TOP_LEVEL

중첩 맵의 최상위 수준을 개별 열로 평면화합니다. 목록 구조는 중첩 상태로 유지됩니다.

최적의 용도: 분석 도구가 DDB 유형 정보가 모두 제거된 중첩된 데이터를 처리할 수 있는 경우 Amazon DynamoDB 데이터의 정확한 구조를 보존하는 데 가장 적합합니다.

최적의 용도: Amazon DynamoDB 테이블 항목에 일관된 스키마가 있는 경우 데이터 구조의 보존과 쿼리 단순성 사이의 균형을 맞추는 데 가장 적합합니다.

모든 수준 중첩 해제 - FULL(기본값)

API 값: FULL

모든 중첩 구조(맵 및 목록)를 점 표기법을 사용하여 개별 열로 재귀적으로 평면화하고 이름을 지정합니다.

최적의 용도: 심층 중첩 구조와 평평한 스키마를 선호하는 분석 도구와 함께 작업하는 경우 쿼리 단순화를 극대화하는 데 가장 적합합니다.

참고

DynamoDB 데이터에 변동 가능 또는 심층 중첩 구조가 있다면 완전한 중첩 해제로 인해 매우 넓은 테이블과 많은 열이 생성될 수 있습니다.

예 API에서 중첩 해제 옵션 사용

CreateIntegrationTableProperty API를 통해 스키마 중첩 해제를 구성할 때 UnnestSpec 파라미터에서 중첩 해제 옵션을 지정합니다.

aws glue create-integration-table-property --resource-arn "arn:aws:glue:us-east-1:123456789012:database/my_db" --table-name "my-table" --cli-input-json '{ "TargetTableConfig": { "UnnestSpec": "FULL", "TargetTableName": "my-target-table", } }'

중첩 해제 예제

다음 구조가 있는 DynamoDB 항목을 고려하세요.

// Input DynamoDB Record { "Item": { "col_1": { "S": "value_1" }, "col_2": { "M": { "col_3": { "M": { "id": { "S": "value_3" } } }, "col_4": { "BOOL": true } } } } }

NO_UNNEST 예제

NO_UNNEST를 사용하면 전체 행이 하나의 열과 프라이머리 키 내에 저장됩니다. DynamoDB 유형 정보는 보존됩니다. 이렇게 하면 Redshift 쿼리 패턴과의 호환성이 유지됩니다.

결과 Iceberg 테이블(col_1이 프라이머리 키라고 가정):

col_1(문자열) 값(구조체)
value_1
{ "col_2": { "M": { "col_3": { "M": { "id": { "S": "value_3" } } }, "col_4": { "BOOL": true } } } }

쿼리는 구조체와 배열 액세스 패턴을 사용해야 합니다.

SELECT value.col_1, value.col_2.M.col_3.M.id.S, value.col_2.M.col_4.BOOL FROM product_table;

TOP_LEVEL 예제

TOP_LEVEL을 사용하면 중첩된 필드를 구조체로 그대로 유지하면서 최상위 필드만 중첩 해제됩니다. DynamoDB 유형 정보가 제거되고 입력이 유지됩니다. 스키마 충돌이 발생할 때 문자열 유형으로 변환합니다.

복제 후 결과 Glue 테이블:

col_1(문자열) col_2(구조체)
value_1
{ "col_3": { "id": "value_3" }, "col_4": true }

첫 번째 수준에서는 쿼리가 간소화됩니다.

SELECT col_1, col_2.col_3.id, col_2.col_4 FROM product_table;

FULL 예제

FULL 중첩 해제를 사용하면 최상위 필드와 중첩된 구조체/맵 필드가 모두 평면화됩니다. 중첩된 필드에 점 표기법이 사용됩니다(예: "col_2.col_3.id"). 배열 요소는 중첩 해제 상태로 유지됩니다. 각 리프 노드는 최상위 열이 됩니다.

복제 후 결과 Glue 테이블:

col_1(문자열) col_2.col_3.id(문자열) col_2.col_4(부울)
value_1 value_3 TRUE

쿼리는 완전히 평면화됩니다.

SELECT col_1, "col_2.col_3.id", "col_2.col_4" FROM product_table;