Data Lake์™€ Data Warehouse

Data Lake์™€ Data Warehouse

๊ฐœ์š”

๋ฐ์ดํ„ฐ ์ €์žฅ์†Œ ์•„ํ‚คํ…์ฒ˜๋Š” ์กฐ์ง์˜ ๋ฐ์ดํ„ฐ ์ „๋žต์— ํ•ต์‹ฌ์ ์ž…๋‹ˆ๋‹ค. Data Lake, Data Warehouse, ๊ทธ๋ฆฌ๊ณ  ๋‘˜์„ ๊ฒฐํ•ฉํ•œ Lakehouse ์•„ํ‚คํ…์ฒ˜์˜ ํŠน์„ฑ๊ณผ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.


1. Data Warehouse

1.1 ๊ฐœ๋…

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                    Data Warehouse                              โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                โ”‚
โ”‚   ํŠน์ง•:                                                        โ”‚
โ”‚   - ๊ตฌ์กฐํ™”๋œ ๋ฐ์ดํ„ฐ (์Šคํ‚ค๋งˆ ์ •์˜ ํ•„์ˆ˜)                           โ”‚
โ”‚   - Schema-on-Write (์“ฐ๊ธฐ ์‹œ ์Šคํ‚ค๋งˆ ์ ์šฉ)                       โ”‚
โ”‚   - ๋ถ„์„ ์ตœ์ ํ™” (OLAP)                                         โ”‚
โ”‚   - SQL ๊ธฐ๋ฐ˜ ์ฟผ๋ฆฌ                                              โ”‚
โ”‚                                                                โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
โ”‚   โ”‚                    Data Warehouse                     โ”‚    โ”‚
โ”‚   โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”โ”‚    โ”‚
โ”‚   โ”‚   โ”‚  Dim Tables    โ”‚    Fact Tables                 โ”‚โ”‚    โ”‚
โ”‚   โ”‚   โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                 โ”‚โ”‚    โ”‚
โ”‚   โ”‚   โ”‚  โ”‚dim_date  โ”‚  โ”‚  โ”‚fact_salesโ”‚                 โ”‚โ”‚    โ”‚
โ”‚   โ”‚   โ”‚  โ”‚dim_productโ”‚  โ”‚  โ”‚fact_ordersโ”‚                โ”‚โ”‚    โ”‚
โ”‚   โ”‚   โ”‚  โ”‚dim_customerโ”‚ โ”‚                               โ”‚โ”‚    โ”‚
โ”‚   โ”‚   โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                 โ”‚โ”‚    โ”‚
โ”‚   โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜โ”‚    โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
โ”‚                                                                โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

1.2 ์ฃผ์š” ์†”๋ฃจ์…˜

์†”๋ฃจ์…˜ ์œ ํ˜• ํŠน์ง•
Snowflake ํด๋ผ์šฐ๋“œ ๋ถ„๋ฆฌ๋œ ์Šคํ† ๋ฆฌ์ง€/์ปดํ“จํŒ…, ์ž๋™ ํ™•์žฅ
BigQuery ํด๋ผ์šฐ๋“œ (GCP) ์„œ๋ฒ„๋ฆฌ์Šค, ํŽ˜ํƒ€๋ฐ”์ดํŠธ ๊ทœ๋ชจ
Redshift ํด๋ผ์šฐ๋“œ (AWS) Columnar, MPP ์•„ํ‚คํ…์ฒ˜
Synapse ํด๋ผ์šฐ๋“œ (Azure) ํ†ตํ•ฉ ๋ถ„์„ ํ”Œ๋žซํผ
PostgreSQL ์˜จํ”„๋ ˆ๋ฏธ์Šค ์†Œ๊ทœ๋ชจ, ์˜คํ”ˆ์†Œ์Šค

1.3 Data Warehouse SQL ์˜ˆ์‹œ

-- Snowflake/BigQuery ์Šคํƒ€์ผ ๋ถ„์„ ์ฟผ๋ฆฌ

-- ์›”๋ณ„ ๋งค์ถœ ํŠธ๋ Œ๋“œ
SELECT
    d.year,
    d.month,
    d.month_name,
    SUM(f.sales_amount) AS total_sales,
    COUNT(DISTINCT f.customer_sk) AS unique_customers,
    AVG(f.sales_amount) AS avg_order_value,
    -- ์ „์›” ๋Œ€๋น„ ์„ฑ์žฅ๋ฅ 
    (SUM(f.sales_amount) - LAG(SUM(f.sales_amount)) OVER (ORDER BY d.year, d.month))
        / NULLIF(LAG(SUM(f.sales_amount)) OVER (ORDER BY d.year, d.month), 0) * 100
        AS mom_growth_pct
FROM fact_sales f
JOIN dim_date d ON f.date_sk = d.date_sk
WHERE d.year >= 2023
GROUP BY d.year, d.month, d.month_name
ORDER BY d.year, d.month;


-- ๊ณ ๊ฐ ์„ธ๊ทธ๋จผํŠธ๋ณ„ LTV (Life Time Value)
WITH customer_metrics AS (
    SELECT
        c.customer_sk,
        c.customer_segment,
        MIN(d.full_date) AS first_purchase_date,
        MAX(d.full_date) AS last_purchase_date,
        COUNT(DISTINCT f.order_id) AS total_orders,
        SUM(f.sales_amount) AS total_revenue
    FROM fact_sales f
    JOIN dim_customer c ON f.customer_sk = c.customer_sk
    JOIN dim_date d ON f.date_sk = d.date_sk
    GROUP BY c.customer_sk, c.customer_segment
)
SELECT
    customer_segment,
    COUNT(*) AS customer_count,
    AVG(total_orders) AS avg_orders,
    AVG(total_revenue) AS avg_ltv,
    PERCENTILE_CONT(0.5) WITHIN GROUP (ORDER BY total_revenue) AS median_ltv
FROM customer_metrics
GROUP BY customer_segment
ORDER BY avg_ltv DESC;

2. Data Lake

2.1 ๊ฐœ๋…

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                      Data Lake                                 โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                โ”‚
โ”‚   ํŠน์ง•:                                                        โ”‚
โ”‚   - ๋ชจ๋“  ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ (๊ตฌ์กฐํ™”, ๋ฐ˜๊ตฌ์กฐํ™”, ๋น„๊ตฌ์กฐํ™”)               โ”‚
โ”‚   - Schema-on-Read (์ฝ๊ธฐ ์‹œ ์Šคํ‚ค๋งˆ ์ ์šฉ)                        โ”‚
โ”‚   - ์›๋ณธ ๋ฐ์ดํ„ฐ ๋ณด์กด                                           โ”‚
โ”‚   - ์ €๋น„์šฉ ์Šคํ† ๋ฆฌ์ง€                                            โ”‚
โ”‚                                                                โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”    โ”‚
โ”‚   โ”‚                     Data Lake                         โ”‚    โ”‚
โ”‚   โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚    โ”‚
โ”‚   โ”‚  โ”‚  Raw Zone (Bronze)                              โ”‚  โ”‚    โ”‚
โ”‚   โ”‚  โ”‚  - ์›๋ณธ ๋ฐ์ดํ„ฐ (JSON, CSV, Logs, Images)        โ”‚  โ”‚    โ”‚
โ”‚   โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚    โ”‚
โ”‚   โ”‚                         โ†“                             โ”‚    โ”‚
โ”‚   โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚    โ”‚
โ”‚   โ”‚  โ”‚  Processed Zone (Silver)                        โ”‚  โ”‚    โ”‚
โ”‚   โ”‚  โ”‚  - ์ •์ œ๋œ ๋ฐ์ดํ„ฐ (Parquet, Delta)               โ”‚  โ”‚    โ”‚
โ”‚   โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚    โ”‚
โ”‚   โ”‚                         โ†“                             โ”‚    โ”‚
โ”‚   โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚    โ”‚
โ”‚   โ”‚  โ”‚  Curated Zone (Gold)                            โ”‚  โ”‚    โ”‚
โ”‚   โ”‚  โ”‚  - ๋ถ„์„/ML ์ค€๋น„ ๋ฐ์ดํ„ฐ                          โ”‚  โ”‚    โ”‚
โ”‚   โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚    โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜    โ”‚
โ”‚                                                                โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

2.2 ์ฃผ์š” ์Šคํ† ๋ฆฌ์ง€

์Šคํ† ๋ฆฌ์ง€ ํด๋ผ์šฐ๋“œ ํŠน์ง•
S3 AWS ๊ฐ์ฒด ์Šคํ† ๋ฆฌ์ง€, ๋†’์€ ๋‚ด๊ตฌ์„ฑ
GCS GCP Google Cloud Storage
ADLS Azure Azure Data Lake Storage
HDFS ์˜จํ”„๋ ˆ๋ฏธ์Šค Hadoop Distributed File System

2.3 Data Lake ํŒŒ์ผ ๊ตฌ์กฐ

s3://my-data-lake/
โ”œโ”€โ”€ raw/                          # Bronze ๋ ˆ์ด์–ด
โ”‚   โ”œโ”€โ”€ orders/
โ”‚   โ”‚   โ”œโ”€โ”€ year=2024/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ month=01/
โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ day=15/
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ orders_20240115_001.json
โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ orders_20240115_002.json
โ”‚   โ”œโ”€โ”€ customers/
โ”‚   โ”‚   โ””โ”€โ”€ snapshot_20240115.csv
โ”‚   โ””โ”€โ”€ logs/
โ”‚       โ””โ”€โ”€ app_logs_20240115.log
โ”‚
โ”œโ”€โ”€ processed/                    # Silver ๋ ˆ์ด์–ด
โ”‚   โ”œโ”€โ”€ orders/
โ”‚   โ”‚   โ””โ”€โ”€ year=2024/
โ”‚   โ”‚       โ””โ”€โ”€ month=01/
โ”‚   โ”‚           โ””โ”€โ”€ part-00000.parquet
โ”‚   โ””โ”€โ”€ customers/
โ”‚       โ””โ”€โ”€ part-00000.parquet
โ”‚
โ””โ”€โ”€ curated/                      # Gold ๋ ˆ์ด์–ด
    โ”œโ”€โ”€ fact_sales/
    โ”‚   โ””โ”€โ”€ year=2024/
    โ”‚       โ””โ”€โ”€ month=01/
    โ””โ”€โ”€ dim_customers/
        โ””โ”€โ”€ current/
# PySpark๋กœ Data Lake ๊ณ„์ธต ์ฒ˜๋ฆฌ
from pyspark.sql import SparkSession
from pyspark.sql.functions import *

spark = SparkSession.builder \
    .appName("DataLakeProcessing") \
    .getOrCreate()

# Raw โ†’ Processed (Bronze โ†’ Silver)
def process_raw_orders():
    # Raw JSON ์ฝ๊ธฐ
    raw_df = spark.read.json("s3://my-data-lake/raw/orders/")

    # ์ •์ œ
    processed_df = raw_df \
        .filter(col("order_id").isNotNull()) \
        .withColumn("processed_at", current_timestamp()) \
        .dropDuplicates(["order_id"])

    # Parquet์œผ๋กœ ์ €์žฅ
    processed_df.write \
        .mode("overwrite") \
        .partitionBy("year", "month") \
        .parquet("s3://my-data-lake/processed/orders/")


# Processed โ†’ Curated (Silver โ†’ Gold)
def create_fact_sales():
    orders = spark.read.parquet("s3://my-data-lake/processed/orders/")
    customers = spark.read.parquet("s3://my-data-lake/processed/customers/")

    fact_sales = orders \
        .join(customers, "customer_id") \
        .select(
            col("order_id"),
            col("customer_sk"),
            col("order_date"),
            col("amount").alias("sales_amount")
        )

    fact_sales.write \
        .mode("overwrite") \
        .partitionBy("year", "month") \
        .parquet("s3://my-data-lake/curated/fact_sales/")

3. Data Warehouse vs Data Lake

3.1 ๋น„๊ต

ํŠน์„ฑ Data Warehouse Data Lake
๋ฐ์ดํ„ฐ ์œ ํ˜• ๊ตฌ์กฐํ™” ๋ชจ๋“  ์œ ํ˜•
์Šคํ‚ค๋งˆ Schema-on-Write Schema-on-Read
์‚ฌ์šฉ์ž ๋น„์ฆˆ๋‹ˆ์Šค ๋ถ„์„๊ฐ€ ๋ฐ์ดํ„ฐ ๊ณผํ•™์ž, ์—”์ง€๋‹ˆ์–ด
์ฒ˜๋ฆฌ OLAP ๋ฐฐ์น˜, ์ŠคํŠธ๋ฆฌ๋ฐ, ML
๋น„์šฉ ๋†’์Œ ๋‚ฎ์Œ
์ฟผ๋ฆฌ ์„ฑ๋Šฅ ์ตœ์ ํ™”๋จ ๊ฐ€๋ณ€์ 
๋ฐ์ดํ„ฐ ํ’ˆ์งˆ ๋†’์Œ (์ •์ œ๋จ) ๊ฐ€๋ณ€์ 

3.2 ์„ ํƒ ๊ธฐ์ค€

def choose_architecture(requirements: dict) -> str:
    """์•„ํ‚คํ…์ฒ˜ ์„ ํƒ ๊ฐ€์ด๋“œ"""

    warehouse_factors = [
        requirements.get('structured_data_only', False),
        requirements.get('sql_analytics_primary', False),
        requirements.get('strict_governance', False),
        requirements.get('fast_query_response', False),
    ]

    lake_factors = [
        requirements.get('unstructured_data', False),
        requirements.get('ml_workloads', False),
        requirements.get('raw_data_preservation', False),
        requirements.get('cost_sensitive', False),
        requirements.get('schema_flexibility', False),
    ]

    if sum(warehouse_factors) > sum(lake_factors):
        return "Data Warehouse ๊ถŒ์žฅ"
    elif sum(lake_factors) > sum(warehouse_factors):
        return "Data Lake ๊ถŒ์žฅ"
    else:
        return "Lakehouse ๊ณ ๋ ค"

4. Lakehouse

4.1 ๊ฐœ๋…

Lakehouse๋Š” Data Lake์˜ ์œ ์—ฐ์„ฑ๊ณผ Data Warehouse์˜ ์„ฑ๋Šฅ/๊ด€๋ฆฌ ๊ธฐ๋Šฅ์„ ๊ฒฐํ•ฉํ•œ ์•„ํ‚คํ…์ฒ˜์ž…๋‹ˆ๋‹ค.

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                      Lakehouse Architecture                    โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚   โ”‚                   Applications                          โ”‚  โ”‚
โ”‚   โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚  โ”‚
โ”‚   โ”‚  โ”‚    BI    โ”‚ โ”‚    ML    โ”‚ โ”‚  SQL     โ”‚ โ”‚ Streamingโ”‚  โ”‚  โ”‚
โ”‚   โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚  โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚                              โ†“                                 โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚   โ”‚                  Query Engine                           โ”‚  โ”‚
โ”‚   โ”‚        (Spark, Presto, Trino, Dremio)                  โ”‚  โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚                              โ†“                                 โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚   โ”‚              Lakehouse Format Layer                     โ”‚  โ”‚
โ”‚   โ”‚     โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”   โ”‚  โ”‚
โ”‚   โ”‚     โ”‚  ACID Transactions โ”‚ Schema Enforcement      โ”‚   โ”‚  โ”‚
โ”‚   โ”‚     โ”‚  Time Travel       โ”‚ Unified Batch/Streaming โ”‚   โ”‚  โ”‚
โ”‚   โ”‚     โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜   โ”‚  โ”‚
โ”‚   โ”‚           Delta Lake / Apache Iceberg / Apache Hudi    โ”‚  โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚                              โ†“                                 โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚   โ”‚              Object Storage (Data Lake)                 โ”‚  โ”‚
โ”‚   โ”‚                  S3 / GCS / ADLS / HDFS                 โ”‚  โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚                                                                โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

4.2 ํ•ต์‹ฌ ๊ธฐ๋Šฅ

๊ธฐ๋Šฅ ์„ค๋ช…
ACID ํŠธ๋žœ์žญ์…˜ ๋ฐ์ดํ„ฐ ๋ฌด๊ฒฐ์„ฑ ๋ณด์žฅ
์Šคํ‚ค๋งˆ ์ง„ํ™” ์Šคํ‚ค๋งˆ ๋ณ€๊ฒฝ ์ง€์›
ํƒ€์ž„ ํŠธ๋ž˜๋ธ” ๊ณผ๊ฑฐ ๋ฐ์ดํ„ฐ ๋ฒ„์ „ ์กฐํšŒ
Upsert/Merge ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ๊ฐฑ์‹ 
ํ†ตํ•ฉ ์ฒ˜๋ฆฌ ๋ฐฐ์น˜ + ์ŠคํŠธ๋ฆฌ๋ฐ ๋‹จ์ผ ํ…Œ์ด๋ธ”

5. Delta Lake

5.1 Delta Lake ๊ธฐ๋ณธ

from pyspark.sql import SparkSession
from delta import *

# Delta Lake ์„ค์ •
spark = SparkSession.builder \
    .appName("DeltaLake") \
    .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.createDataFrame([
    (1, "Alice", 100),
    (2, "Bob", 200),
], ["id", "name", "amount"])

df.write.format("delta").save("/data/delta/users")

# ์ฝ๊ธฐ
delta_df = spark.read.format("delta").load("/data/delta/users")

# SQL๋กœ ์ ‘๊ทผ
spark.sql("CREATE TABLE users USING DELTA LOCATION '/data/delta/users'")
spark.sql("SELECT * FROM users").show()

5.2 Delta Lake ๊ณ ๊ธ‰ ๊ธฐ๋Šฅ

from delta.tables import DeltaTable

# MERGE (Upsert)
delta_table = DeltaTable.forPath(spark, "/data/delta/users")

new_data = spark.createDataFrame([
    (1, "Alice Updated", 150),  # ์—…๋ฐ์ดํŠธ
    (3, "Charlie", 300),        # ์‚ฝ์ž…
], ["id", "name", "amount"])

delta_table.alias("target").merge(
    new_data.alias("source"),
    "target.id = source.id"
).whenMatchedUpdate(set={
    "name": "source.name",
    "amount": "source.amount"
}).whenNotMatchedInsert(values={
    "id": "source.id",
    "name": "source.name",
    "amount": "source.amount"
}).execute()


# Time Travel (๊ณผ๊ฑฐ ๋ฒ„์ „ ์กฐํšŒ)
# ๋ฒ„์ „ ๋ฒˆํ˜ธ๋กœ
df_v0 = spark.read.format("delta") \
    .option("versionAsOf", 0) \
    .load("/data/delta/users")

# ํƒ€์ž„์Šคํƒฌํ”„๋กœ
df_yesterday = spark.read.format("delta") \
    .option("timestampAsOf", "2024-01-14") \
    .load("/data/delta/users")


# ํžˆ์Šคํ† ๋ฆฌ ํ™•์ธ
delta_table.history().show()


# Vacuum (์˜ค๋ž˜๋œ ํŒŒ์ผ ์ •๋ฆฌ)
delta_table.vacuum(retentionHours=168)  # 7์ผ ๋ณด์กด


# ์Šคํ‚ค๋งˆ ์ง„ํ™”
spark.read.format("delta") \
    .option("mergeSchema", "true") \
    .load("/data/delta/users")


# Z-Order ์ตœ์ ํ™” (์ฟผ๋ฆฌ ์„ฑ๋Šฅ)
delta_table.optimize().executeZOrderBy("date", "customer_id")

6. Apache Iceberg

6.1 Iceberg ๊ธฐ๋ณธ

from pyspark.sql import SparkSession

spark = SparkSession.builder \
    .appName("Iceberg") \
    .config("spark.sql.extensions", "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \
    .config("spark.sql.catalog.iceberg", "org.apache.iceberg.spark.SparkCatalog") \
    .config("spark.sql.catalog.iceberg.type", "hive") \
    .config("spark.sql.catalog.iceberg.uri", "thrift://localhost:9083") \
    .getOrCreate()

# Iceberg ํ…Œ์ด๋ธ” ์ƒ์„ฑ
spark.sql("""
    CREATE TABLE iceberg.db.users (
        id INT,
        name STRING,
        amount DECIMAL(10, 2)
    ) USING ICEBERG
    PARTITIONED BY (bucket(16, id))
""")

# ๋ฐ์ดํ„ฐ ์‚ฝ์ž…
spark.sql("""
    INSERT INTO iceberg.db.users VALUES
    (1, 'Alice', 100.00),
    (2, 'Bob', 200.00)
""")

# Time Travel
spark.sql("SELECT * FROM iceberg.db.users VERSION AS OF 1").show()
spark.sql("SELECT * FROM iceberg.db.users TIMESTAMP AS OF '2024-01-15'").show()

# ์Šค๋ƒ…์ƒท ํ™•์ธ
spark.sql("SELECT * FROM iceberg.db.users.snapshots").show()

6.2 Delta Lake vs Iceberg ๋น„๊ต

ํŠน์„ฑ Delta Lake Iceberg
๊ฐœ๋ฐœ์‚ฌ Databricks Netflix โ†’ Apache
ํ˜ธํ™˜์„ฑ Spark ์ค‘์‹ฌ ์—”์ง„ ๋…๋ฆฝ์ 
๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํŠธ๋žœ์žญ์…˜ ๋กœ๊ทธ ์Šค๋ƒ…์ƒท ๊ธฐ๋ฐ˜
ํŒŒํ‹ฐ์…˜ ์ง„ํ™” ์ œํ•œ์  ๊ฐ•๋ ฅํ•œ ์ง€์›
์ˆจ๊ฒจ์ง„ ํŒŒํ‹ฐ์…˜ ๋ฏธ์ง€์› ์ง€์›
์ปค๋ฎค๋‹ˆํ‹ฐ Databricks ์ƒํƒœ๊ณ„ ๋‹ค์–‘ํ•œ ๋ฒค๋”

7. ๋ชจ๋˜ ๋ฐ์ดํ„ฐ ์Šคํƒ

7.1 ์•„ํ‚คํ…์ฒ˜ ํŒจํ„ด

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚                   Modern Data Stack                             โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚                                                                 โ”‚
โ”‚   Data Sources                                                  โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”                  โ”‚
โ”‚   โ”‚ SaaS   โ”‚ โ”‚Databaseโ”‚ โ”‚  API   โ”‚ โ”‚  IoT   โ”‚                  โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”ฌโ”€โ”€โ”€โ”€โ”˜                  โ”‚
โ”‚        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ดโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜                        โ”‚
โ”‚                         โ†“                                       โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚   โ”‚              Ingestion (EL)                              โ”‚  โ”‚
โ”‚   โ”‚        Fivetran / Airbyte / Stitch                       โ”‚  โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚                         โ†“                                       โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚   โ”‚           Cloud Data Warehouse / Lakehouse              โ”‚  โ”‚
โ”‚   โ”‚        Snowflake / BigQuery / Databricks                โ”‚  โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚                         โ†“                                       โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚   โ”‚              Transformation (T)                          โ”‚  โ”‚
โ”‚   โ”‚                      dbt                                 โ”‚  โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚                         โ†“                                       โ”‚
โ”‚   โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚   โ”‚                 BI / Analytics                           โ”‚  โ”‚
โ”‚   โ”‚        Looker / Tableau / Metabase / Mode               โ”‚  โ”‚
โ”‚   โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”‚                                                                 โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

์—ฐ์Šต ๋ฌธ์ œ

๋ฌธ์ œ 1: ์•„ํ‚คํ…์ฒ˜ ์„ ํƒ

๋‹ค์Œ ์š”๊ตฌ์‚ฌํ•ญ์— ๋งž๋Š” ์•„ํ‚คํ…์ฒ˜๋ฅผ ์„ ํƒํ•˜๊ณ  ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜์„ธ์š”: - ์ผ์ผ 10TB์˜ ๋กœ๊ทธ ๋ฐ์ดํ„ฐ - ML ๋ชจ๋ธ ํ•™์Šต์— ์‚ฌ์šฉ - ์›๋ณธ ๋ฐ์ดํ„ฐ 5๋…„ ๋ณด์กด ํ•„์š”

๋ฌธ์ œ 2: Delta Lake ๊ตฌํ˜„

๊ณ ๊ฐ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ SCD Type 2๋ฅผ Delta Lake MERGE๋กœ ๊ตฌํ˜„ํ•˜์„ธ์š”.


์š”์•ฝ

์•„ํ‚คํ…์ฒ˜ ํŠน์ง• ์‚ฌ์šฉ ์‚ฌ๋ก€
Data Warehouse ๊ตฌ์กฐํ™”, SQL ์ตœ์ ํ™” BI, ๋ฆฌํฌํŒ…
Data Lake ๋ชจ๋“  ๋ฐ์ดํ„ฐ, ์ €๋น„์šฉ ML, ์›๋ณธ ๋ณด์กด
Lakehouse Lake + Warehouse ์žฅ์  ํ†ตํ•ฉ ๋ถ„์„

์ฐธ๊ณ  ์ž๋ฃŒ

to navigate between lessons