Что такое процесс ETL (Extract, Transform, Load)?

«Что такое процесс ETL (Extract, Transform, Load)?» — вопрос из категории Базы данных, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

ETL (Extract, Transform, Load) — это стандартный процесс интеграции данных, который включает три последовательных этапа для подготовки и перемещения данных из исходных систем в целевое хранилище, такое как Data Warehouse (DWH) или Data Mart.

Три этапа ETL:

  1. Extract (Извлечение): Данные извлекаются из различных гетерогенных источников.
    • Источники: Реляционные БД (MySQL, PostgreSQL), NoSQL БД, CRM/ERP-системы, API, CSV/JSON/XML файлы, лог-файлы.
  2. Transform (Преобразование): Извлеченные данные очищаются, валидируются и приводятся к нужному формату. Это самый сложный и важный этап.
    • Типичные операции:
      • Очистка: Исправление опечаток, приведение к единому формату (даты, телефоны).
      • Стандартизация: Приведение единиц измерения, кодировок.
      • Обогащение: Добавление недостающих данных из других источников.
      • Агрегация: Вычисление сумм, средних, количеств.
      • Фильтрация: Удаление дубликатов, отсев нерелевантных записей.
      • Соединение (Join): Объединение данных из разных таблиц или источников.
  3. Load (Загрузка): Преобразованные данные загружаются в целевую систему.
    • Режимы загрузки:
      • Полная загрузка (Full Load): Полная перезапись целевой таблицы.
      • Инкрементальная загрузка (Incremental Load): Загрузка только новых или измененных данных с момента последнего обновления.

Пример простого ETL-пайплайна на Python (с использованием Pandas):

import pandas as pd

# 1. EXTRACT: Чтение данных из CSV
raw_data = pd.read_csv('sales_raw.csv')

# 2. TRANSFORM: Очистка и преобразование
transformed_data = (
    raw_data
    .dropna(subset=['customer_id', 'amount'])  # Удалить строки с пустыми ID или суммой
    .assign(sale_date = pd.to_datetime(raw_data['sale_date'], errors='coerce')) # Привести дату
    .query('amount > 0')  # Отфильтровать некорректные суммы
    .groupby('customer_id', as_index=False)['amount'].sum()  # Агрегировать
)

# 3. LOAD: Запись результата в новую таблицу/файл
transformed_data.to_sql('customer_totals', con=database_engine, if_exists='replace', index=False)

Популярные ETL-инструменты:

  • Корпоративные/коммерческие: Informatica PowerCenter, IBM DataStage, Microsoft SSIS, Talend.
  • Open-source: Apache NiFi, Apache Airflow (оркестрация), Pentaho Data Integration.
  • Облачные сервисы: AWS Glue, Google Cloud Dataflow, Azure Data Factory.

Сценарии использования: Построение хранилищ данных (DWH), консолидация данных для отчетности и BI, миграция данных между системами.