AWS Glue ETL | DynamicFrame과 주요 Transformation 이해하기

2026. 7. 15. 11:55·Data Engineering/AWS

들어가며

데이터를 분석에 활용하려면 여러 저장소에서 데이터를 가져오고, 필요한 형태로 정제한 뒤, 분석용 저장소에 적재하는 과정이 필요합니다. 이러한 과정을 일반적으로 ETL(Extract, Transform, Load)이라고 합니다.

직접 ETL 환경을 구축하려면 Spark 클러스터를 준비하고 실행 환경을 관리해야 하지만, AWS Glue를 이용하면 별도의 서버나 클러스터를 직접 운영하지 않고도 데이터 처리 작업을 실행할 수 있습니다.

AWS Glue는 데이터를 수집하고 변환하며, Amazon S3나 Amazon Redshift 같은 저장소에 적재할 수 있도록 지원하는 서버리스 데이터 통합 서비스입니다. Glue ETL 작업에서는 PySpark와 함께 AWS가 제공하는 DynamicFrame과 다양한 Transformation을 사용할 수 있습니다.

이번 글에서는 AWS Glue ETL의 기본 개념부터 DynamicFrame, DropFields, Filter, Join, Map, 그리고 머신러닝 기반 중복 탐지 기능인 FindMatches까지 살펴보겠습니다.


1. AWS Glue ETL이란?

AWS Glue ETL은 여러 데이터 소스에서 데이터를 읽고, 필요한 형태로 변환한 뒤, 다른 저장소에 적재하는 기능입니다.

예를 들어 Amazon S3에 저장된 주문 데이터를 정제하여 Amazon Redshift에 적재한다면 다음과 같은 흐름으로 구성할 수 있습니다.

Amazon S3
    │
    ▼
AWS Glue ETL
    │
    ├─ 불필요한 컬럼 제거
    ├─ 조건에 맞는 데이터 필터링
    ├─ 다른 데이터와 JOIN
    └─ 데이터 타입 및 형식 변환
    │
    ▼
Amazon Redshift

AWS Glue의 Spark ETL 작업은 Python 기반 PySpark 문법을 지원하며, AWS Glue 전용 클래스와 Transformation을 함께 사용할 수 있습니다. 


2. DynamicFrame이란?

DynamicFrame은 AWS Glue가 ETL 작업을 위해 제공하는 데이터 구조입니다.

Spark의 DataFrame과 비슷하게 행과 컬럼 형태의 데이터를 다루지만, 정형화되지 않았거나 컬럼의 데이터 타입이 일정하지 않은 데이터를 처리하는 데 더 유연하도록 설계되었습니다.

 

AWS Glue Studio에서는 Transformation 노드 사이의 데이터가 주로 DynamicFrame 형태로 전달됩니다. AWS 공식 문서에서는 이를 Spark SQL DataFrame을 확장한 구조로 설명합니다.

2-1) 왜 DynamicFrame이 필요할까?

다음과 같은 JSON 데이터가 있다고 가정해 보겠습니다.

{"user_id": 1, "age": 25}
{"user_id": 2, "age": "30"}
{"user_id": 3, "age": null}

age 컬럼에 숫자, 문자열, null이 섞여 있습니다.

일반적인 DataFrame에서는 데이터를 읽을 때 스키마를 결정해야 하므로 타입 충돌이 발생할 수 있습니다. 반면 DynamicFrame은 각 레코드가 자신의 구조와 타입 정보를 가질 수 있어, 스키마가 일정하지 않은 데이터를 우선 읽은 뒤 ETL 과정에서 타입을 정리할 수 있습니다.

 

DynamicFrame은 스키마를 미리 고정하지 않고도 생성할 수 있으며, 필요한 시점에 스키마를 계산합니다. 각 레코드는 자기 설명적인 DynamicRecord 형태로 표현됩니다.

2-2) DynamicFrame 생성 예시

Glue Data Catalog에 등록된 테이블을 읽는 예시입니다.

from awsglue.context import GlueContext
from pyspark.context import SparkContext

sc = SparkContext.getOrCreate()
glue_context = GlueContext(sc)

orders_dyf = glue_context.create_dynamic_frame.from_catalog(
    database="sales_db",
    table_name="orders"
)

orders_dyf.printSchema()
orders_dyf.show(5)

이 코드는 Data Catalog에서 sales_db.orders 테이블의 메타데이터를 확인하고, 실제 데이터로부터 DynamicFrame을 생성합니다.


3. DynamicFrame과 DataFrame의 차이

항목 DynamicFrame Spark DataFrame
주요 목적 Glue ETL 처리 범용 Spark 처리
스키마 유연하게 처리 비교적 고정적
비정형 데이터 처리에 유리 사전 정리가 필요할 수 있음
Glue Transformation 바로 사용 가능 일부 변환 필요
Spark SQL 직접 사용 제한 바로 사용 가능
타입 충돌 처리 Choice Type 제공 직접 처리 필요

DynamicFrame이 모든 면에서 DataFrame보다 좋은 것은 아닙니다.

복잡한 집계, Window 함수, Spark SQL 또는 세부적인 PySpark 처리가 필요하다면 DataFrame으로 변환하여 사용하는 경우가 많습니다.


4. AWS Glue Transformation이란?

Transformation은 입력 데이터를 원하는 형태로 변경하는 처리 단계입니다.

AWS Glue Studio에서는 데이터가 다음 노드로 이동하는 과정에서 각 Transformation이 적용됩니다.

https://aws.amazon.com/ko/blogs/big-data/prepare-and-load-amazon-s3-data-into-teradata-using-aws-glue-through-its-native-connector-for-teradata-vantage/

Glue Studio는 데이터를 정제하고 변환할 수 있도록 여러 내장 Transformation 노드를 제공하며, 노드 사이의 데이터는 DynamicFrame 형태로 전달됩니다.

4-1) DropFields

DropFields는 필요하지 않은 컬럼을 제거하는 Transformation입니다.

order_id user_id amount internal_memo temp_value
1001 U01 30000 test 123

분석에 internal_memo, temp_value가 필요하지 않다면 삭제할 수 있습니다.

clean_orders = orders_dyf.drop_fields(
    paths=["internal_memo", "temp_value"]
)
언제 사용할까?
  • 개인정보 컬럼 제거
  • 임시 컬럼 제거
  • 분석에 필요하지 않은 컬럼 제거
  • 저장 용량과 처리량 감소
  • Target 테이블 스키마에 맞추기

DropFields를 먼저 적용하면 이후 단계에서 처리할 데이터 크기를 줄일 수 있습니다.

4-2) Filter

Filter는 조건을 만족하는 레코드만 남기는 Transformation입니다.

결제 완료 상태이면서 결제 금액이 10,000원 이상인 주문만 남길 수 있습니다.

filtered_orders = orders_dyf.filter(
    f=lambda row:
        row["status"] == "PAID"
        and row["amount"] >= 10000
)

입력 데이터

order_id status amount
1001 PAID 30000
1002 CANCELLED 20000
1003 PAID 5000

변환 결과

order_id status amount
1001 PAID 30000

언제 사용할까?

  • 특정 기간 데이터만 추출
  • 정상 상태 데이터만 유지
  • 결측값이 있는 데이터 제외
  • 특정 지역이나 사용자 그룹 추출
  • 금액 또는 수량 조건 적용

단, 파티션 단위로 데이터를 미리 제외할 수 있다면 Transformation 이후의 Filter만 사용하기보다 push_down_predicate를 이용해 읽기 단계에서 불필요한 파티션을 제외하는 것이 더 효율적일 수 있습니다.

4-3) Join

Join은 두 DynamicFrame을 공통 키를 기준으로 결합하는 Transformation입니다.

예를 들어 주문 데이터와 사용자 데이터를 user_id로 연결할 수 있습니다.

주문 데이터

order_id user_id amount
1001 U01 30000
1002 U02 15000

사용자 데이터

user_id user_nam region
U01 김철수 서울
U02 이영희 부산
joined_dyf = orders_dyf.join(
    paths1=["user_id"],
    paths2=["user_id"],
    frame2=users_dyf
)

결과

order_id user_id amount user_nam region
1001 U01 30000 김철수 서울
1002 U02 15000 이영희 부산

AWS Glue는 DynamicFrame 간 Join을 지원하며, 공식 예제에서도 여러 데이터셋을 결합하고 중첩 데이터를 정규화하는 흐름을 제공합니다.

주의할 점

Join 대상 데이터가 크다면 다음 항목을 확인해야 합니다.

  • Join Key의 데이터 타입이 같은가
  • 키 값의 형식이 일치하는가
  • 중복 키가 존재하는가
  • 한쪽 데이터에 특정 키가 집중되어 있지 않은가
  • 불필요한 컬럼을 먼저 제거했는가

4-4) Map

Map은 각 레코드에 사용자 정의 함수를 적용하는 Transformation입니다. 기본 Transformation만으로 표현하기 어려운 변환 로직을 직접 작성할 때 사용합니다.

예를 들어 이름 앞뒤의 공백을 제거하고 금액에 부가세를 계산할 수 있습니다.

def transform_order(record):
    record["user_name"] = record["user_name"].strip()
    record["amount_with_tax"] = int(record["amount"] * 1.1)
    return record

mapped_orders = orders_dyf.map(
    f=transform_order
)

입력 데이터

user_name amount
" 김철수 " 10000

변환 결과

user_name amount amount_with_tax
김철수 10000 11000

언제 사용할까?

  • 문자열 형식 통일
  • 새로운 파생 컬럼 생성
  • 날짜 형식 변경
  • 여러 컬럼을 이용한 계산
  • 값의 조건부 치환
  • 복잡한 사용자 정의 전처리

다만 단순한 컬럼 연산은 DataFrame의 내장 함수가 더 빠르고 최적화되기 쉬울 수 있습니다. 복잡한 레코드 단위 로직이 필요한 경우 Map을 사용하는 것이 적합합니다.


5. FindMatches ML Transformation

FindMatches는 고유 키가 없거나 값이 정확히 일치하지 않는 데이터에서 동일하거나 유사한 레코드를 탐지하는 머신러닝 기반 Transformation입니다.

단순한 dropDuplicates()는 모든 비교 컬럼의 값이 같아야 중복으로 판단합니다. 하지만 현실의 데이터는 다음처럼 조금씩 다를 수 있습니다.

name address phone
홍길동 서울시 강남구 테헤란로 10 010-1234-5678
홍 길동 서울 강남구 테헤란로10 01012345678
Hong Gildong 강남구 테헤란로 10 010-1234-5678

이 레코드들은 문자열이 완전히 같지는 않지만 같은 사람일 가능성이 있습니다.

 

FindMatches는 공통 고유 식별자가 없거나 필드가 정확히 일치하지 않더라도 유사한 레코드를 찾아 그룹화할 수 있습니다. 결과 DynamicFrame에는 같은 그룹에 속한 레코드를 식별하는 고유 ID가 추가됩니다.

 

언제 사용할까?

  • 고객 데이터 중복 제거
  • 거래처명 통합
  • 병원 환자 정보 매칭
  • 상품 데이터 통합
  • 서로 다른 시스템의 고객 데이터 연결
  • 주소나 전화번호 형식이 다른 레코드 탐지

단순한 정확 일치로 중복을 판별할 수 있다면 일반적인 SQL이나 DataFrame 중복 제거가 더 간단합니다. FindMatches는 표현이 조금씩 다른 동일 엔티티를 찾아야 할 때 적합합니다.


6. Transformation 선택 기준

Transformation 사용 목적
DropFields 불필요한 컬럼 제거
Filter 조건에 맞는 행만 선택
Join 두 데이터셋 결합
Map 레코드별 사용자 정의 로직 적용
ApplyMapping 컬럼명 및 타입 변경
FindMatches 유사하거나 중복된 레코드 탐지

Transformation은 기능만 보고 선택하는 것이 아니라, 처리 순서도 함께 고려해야 합니다.

필터링
→ 불필요한 컬럼 제거
→ 데이터 정제
→ Join
→ 컬럼 및 타입 정리
→ 저장

처리 대상 데이터의 행과 컬럼을 먼저 줄인 뒤 Join이나 복잡한 변환을 수행하면 불필요한 연산을 줄일 수 있습니다.


7. 마치며

이번 글에서는 AWS Glue ETL의 기본 구조와 DynamicFrame, 그리고 주요 Transformation을 살펴보았습니다.

 

처음에는 Glue를 단순히 데이터를 옮기는 서비스라고 생각할 수 있지만, 학습하면서 DynamicFrame을 기반으로 스키마가 일정하지 않은 데이터를 유연하게 읽고, DropFields·Filter·Join·Map 등의 Transformation을 조합하여 데이터 흐름을 구성하는 서비스라는 점을 이해할 수 있었습니다.

 

특히 DynamicFrame은 Spark DataFrame과 유사하지만, 실제 ETL 과정에서 발생할 수 있는 타입 불일치와 불완전한 스키마를 다루기 위해 Glue에 맞게 확장된 데이터 구조라는 점을 알게 되었습니다.

 

또한 FindMatches를 활용하면 단순한 값 비교만으로 찾기 어려운 유사 레코드까지 머신러닝을 이용해 식별할 수 있어, 고객이나 상품 데이터의 중복을 정리하는 데 활용할 수 있다는 점도 배울 수 있었습니다.

 

결국 Glue ETL을 구성할 때는 Transformation을 많이 사용하는 것보다 어떤 데이터를 먼저 줄이고, 어떤 기준으로 정제하며, 어떤 형태로 저장할 것인지 흐름을 설계하는 것이 중요하다고 생각합니다.

'Data Engineering > AWS' 카테고리의 다른 글

AWS Glue DataBrew란  (0) 2026.07.20
AWS Glue Jobs & AWS Glue Data Quality(DQDL)  (0) 2026.07.20
Amazon EKS란  (0) 2026.07.09
Amazon ECR이란  (0) 2026.07.09
Amazon ECS란  (0) 2026.07.09
'Data Engineering/AWS' 카테고리의 다른 글
  • AWS Glue DataBrew란
  • AWS Glue Jobs & AWS Glue Data Quality(DQDL)
  • Amazon EKS란
  • Amazon ECR이란
jjaehyeok
jjaehyeok
jjaehyeok 님의 블로그 입니다.
  • jjaehyeok
    jjaehyeok 님의 블로그
    jjaehyeok
  • 전체
    오늘
    어제
    • 분류 전체보기 (114) N
      • Navisafe (16)
        • Infrastructure (14)
        • Data Pipeline (0)
        • Trouble shooting (2)
      • Data Engineering (61) N
        • Airflow (11)
        • Kafka (3)
        • Spark (0)
        • ELK (2)
        • Kubernetes (7)
        • AWS (38) N
        • Flink (0)
      • CodingTest (31)
        • 문제 풀이(Lv1~Lv2) (21)
        • 문제 풀이(Lv3) (10)
        • SQL (0)
      • 알고리즘 정리 (3)
        • 자료구조 (스택, 큐, 해시) (3)
        • 정렬 & 그리디 (0)
        • DFS & BFS (0)
        • 이분탐색 (0)
        • DP (0)
      • 자격증 (1)
        • CKAD (1)
        • DEA-C01 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    Glue
    DEA-C01
    AWS
    documentdb
    eks
    DynamoDB
    S3
    drea-c01
    Athena
    elk
    datatransfer
    CKAD
    EC2
    datasync
    Redshift
    k8s
    ECR
    Kafka
    Airflow
    trouble shooting
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
jjaehyeok
AWS Glue ETL | DynamicFrame과 주요 Transformation 이해하기
상단으로

티스토리툴바