카테고리 없음

Databricks로 배우는 데이터 정제 (Cleaning Data) 실습 정리

상꼬 2025. 6. 8. 22:33
728x90
반응형

Databricks의 Basic Transformations 시리즈 중 4. Cleaning Data 파트는 Spark SQL을 활용하여 데이터셋을 정제(clean)하고, 분석 가능한 형태로 가공하는 일련의 과정을 다룹니다.
정제는 단순한 작업 같지만, 실무에서는 데이터 분석의 절반 이상을 차지할 만큼 중요한 단계이기도 하다. 이번 실습은 users_bronze라는 원시 테이블에서 시작해 users_silver라는 클린 테이블로 가공하는 흐름으로 구성된다.


1️⃣ Cleaning Data 소개

이 강의에서는 다양한 컬럼 표현식과 SQL 쿼리를 사용하여 데이터를 정제하는 방법을 배운다.
Spark SQL에서는 일반적인 SQL 문법들(DISTINCT, WHERE, GROUP BY 등)을 사용할 수 있으며, 내장 함수나 연산자도 그대로 사용 가능하다.

✅ 주요 학습 포인트:

  • 컬럼 가공 표현식 이해
  • NULL 값의 처리 방법
  • 중복 제거
  • 문자열 및 날짜 포맷 변환

2️⃣ 학습 목표 (Learning Objectives)

이 강의에서 최종적으로 할 수 있게 되는 것은 다음과 같다:

  • ✅ 데이터셋 요약 및 NULL 처리 이해
  • ✅ 중복 데이터 식별 및 제거
  • ✅ 예상된 건수/누락된 값 검증
  • ✅ 일반적인 데이터 변환 작업 적용

3️⃣ Silver 테이블 생성

원본 테이블인 users_bronze에서 users_silver라는 새 테이블을 만들어, 클린 데이터를 따로 보관한다.
추가적으로 분석에 필요한 컬럼들도 함께 생성해둔다:

CREATE TABLE IF NOT EXISTS users_silver ( 
	user_id STRING, 
    user_first_touch_timestamp BIGINT, 
    email STRING, 
    updated TIMESTAMP, 
    first_touch TIMESTAMP, 
    first_touch_date DATE, 
    first_touch_time STRING, 
    email_domain STRING );


CREATE OR REPLACE TABLE users_silver_working AS
SELECT * FROM users_bronze;

4️⃣ 데이터 프로파일링 (Data Profile)

Databricks에서는 Table 탭에서 "+" → Data Profile"을 클릭하면 데이터 요약 통계와 히스토그램을 자동으로 생성해준다.

  • 수치형, 문자열, 날짜 컬럼에 대한 요약 제공
  • NULL 개수나 분포 등을 쉽게 파악 가능
  • 전체 데이터셋에 대해 한눈에 탐색 가능

📌 실습 팁:
Data Profile 기능은 SQL 결과뿐만 아니라 DataFrame 결과에도 사용할 수 있어서, 정제 전에 항상 사용하는 습관이 좋다.


5️⃣ Missing Data 처리

NULL 값은 특히 수치 연산에서 문제가 되므로 사전에 반드시 처리해야 한다.
예를 들어 user_id가 NULL인 행이 있으면 이는 잘못된 데이터일 가능성이 높으므로 제거한다.

SELECT * 
FROM users_silver_working 
WHERE user_id IS NULL;

CREATE OR REPLACE TABLE users_silver_working AS 
	SELECT * 
    FROM users_silver_working 
    WHERE user_id IS NOT NULL;

6️⃣ 중복 제거 (Deduplication)

✅ 전체 행 기준 중복 제거

전체 행이 동일한 중복 데이터를 제거하려면 DISTINCT * 사용:

INSERT OVERWRITE users_silver_working SELECT DISTINCT(*) FROM users_silver_working;

✅ 특정 컬럼 기준 중복 제거

user_id, user_first_touch_timestamp 컬럼 기준으로 중복을 제거하고 최신 데이터만 남긴다:

CREATE OR REPLACE TABLE users_silver_working AS 
	SELECT * 
    FROM ( 
    	SELECT 
        	*, 
        	ROW_NUMBER() OVER ( 
            	PARTITION BY user_id, user_first_touch_timestamp 
            	ORDER BY updated DESC ) AS row_num 
        FROM users_silver_working 
    	) 
    WHERE row_num = 1;
728x90
반응형