Delta Lake는 Databricks가 오픈소스로 공개한 ACID 트랜잭션을 지원하는 오픈 테이블 포맷이다. 기존 데이터 레이크(S3, HDFS)에 신뢰성, 일관성, 성능을 추가해 레이크하우스(Lakehouse) 아키텍처를 구현한다.
핵심 기능
| 기능 | 설명 |
|---|
| ACID 트랜잭션 | 동시 읽기/쓰기 안전 보장 |
| 스키마 진화 | 열 추가/삭제 자동 처리 |
| Time Travel | 과거 버전 데이터 조회 |
| Upsert (MERGE) | SQL MERGE 지원 |
| 자동 최적화 | 소파일 문제 자동 해결 |
| Change Data Feed | 변경 데이터 캡처 |
PySpark + Delta Lake
python
from delta.tables import DeltaTable
from pyspark.sql import SparkSession
spark = SparkSession.builder .config("spark.sql.extensions", "io.delta.sql.DeltaSparkSessionExtension") .config("spark.sql.catalog.spark_catalog", "org.apache.spark.sql.delta.catalog.DeltaCatalog") .getOrCreate()
# Delta 테이블 생성
df = spark.read.csv("s3://bucket/orders.csv", header=True)
df.write.format("delta").save("s3://bucket/delta/orders")
# Time Travel: 버전별 조회
df_v0 = spark.read.format("delta").option("versionAsOf", 0).load("s3://bucket/delta/orders")
df_yesterday = spark.read.format("delta").option("timestampAsOf", "2024-01-01").load(...)
# MERGE (Upsert)
deltaTable = DeltaTable.forPath(spark, "s3://bucket/delta/orders")
deltaTable.alias("old").merge(
new_data.alias("new"),
"old.order_id = new.order_id"
).whenMatchedUpdateAll() .whenNotMatchedInsertAll() .execute()
Delta Lake vs 유사 포맷
| 항목 | Delta Lake | Apache Iceberg | Apache Hudi |
|---|
| ACID | O | O | O |
| Time Travel | O | O | O |
| 주요 생태계 | Databricks | Snowflake, Flink | AWS, Uber |
| 포맷 | Parquet + 로그 | Parquet + 메타 | Parquet + 인덱스 |
관련 개념