PrepBro
Профессии
PrepBro
Профессия:

Подготовка

  • Вопросы364
  • Задачи16

Аналитика

  • hh статистика
  • Анализ резюме

Практика

  • Тестовое собеседование
  • Mock-собеседование
  • Менторы

Поддержка / отзывы

Telegram админа
Профессия:

Подготовка

  • Вопросы364
  • Задачи16

Аналитика

  • hh статистика
  • Анализ резюме

Практика

  • Тестовое собеседование
  • Mock-собеседование
  • Менторы

Поддержка / отзывы

Telegram админа
Все 24 профессии
Android DeveloperData AnalystSystem Analyst1С DeveloperiOS DeveloperBusiness AnalystJava DeveloperData ScientistQA EngineerQA AutomationPHP BackendC/C++ BackendDevOps EngineerIT Project ManagerFrontend DeveloperNode.js BackendUnity DeveloperC# BackendProduct AnalystFlutter DeveloperPython DeveloperIT Product ManagerGo DeveloperData Engineer

© 2026 PrepBro. Все права защищены.

Telegram-бот

Вопросы по Data Engineer

Когда выгоднее сканировать таблицу целиком, чем использовать индекс?
1.0 Junior🔥 30💬 1

Когда выгоднее сканировать таблицу целиком вместо индекса?

Интересный вопрос! Индекс — не всегда лучше. Есть сценарии, когда full table scan быстрее.

Теория: Query Optimizer Decision

База данных сама решает: использовать индекс или сканировать. Основано на:

Cost = (Rows to read) × (Cost per row) + (Random seeks)

Full scan: 1000000 rows × 1 = 1000000
Index scan: 1000000 seeks + 1000000 reads = 2000000 (медленнее!)

Сценарий 1: Большой результат (> 5-10% таблицы)

-- Таблица: 100M rows
-- На диске: 40 GB, очень кэширована

-- ДА, используй индекс
SELECT * FROM users WHERE country = 'US';  -- 1% результат
-- Cost: индекс seek + 1M reads

-- НЕТ, не используй индекс (сканируй целиком)
SELECT * FROM users WHERE age > 18;  -- 80% результат
-- Cost: 80M random seeks > 40GB seq read
-- Full scan быстрее на 3-5x!

На практике:

EXPLAIN ANALYZE SELECT * FROM users WHERE age > 18;
-- Seq Scan cost: 0..100000
-- Index Scan cost: 0..2000000 (медленнее!)
Читать полностью ->
Как взаимодействуют партиции Kafka, консьюмеры и консьюмер-группы?
2.0 Middle🔥 30💬 1

Взаимодействие партиций Kafka, консьюмеров и консьюмер-групп

Kafka — это распределённая система обмена сообщениями, построенная на основе партиций, консьюмеров и консьюмер-групп. Понимание их взаимодействия критично для построения надёжных data pipelines.

1. Структура Kafka: Топики и партиции

Топик — это логический канал для публикации данных. Каждый топик разделяется на партиции, которые распределены между брокерами для параллельной обработки:

Топик: orders
├── Партиция 0 (Брокер 1)  [msg1, msg2, msg3, msg4]
├── Партиция 1 (Брокер 2)  [msg5, msg6, msg7, msg8]
└── Партиция 2 (Брокер 3)  [msg9, msg10, msg11]

Каждая партиция — это отсортированный лог (append-only log)

Чем больше партиций, тем выше пропускная способность:

# Создание топика с 3 партициями
from kafka.admin import KafkaAdminClient, NewTopic
Читать полностью ->
Расскажи про свой опыт
1.0 Junior🔥 29💬 1

Профессиональный опыт Data Engineer

О себе

Я — опытный Data Engineer с более чем 10 годами в индустрии. Начинал как backend разработчик, но быстро осознал, что моя настоящая страсть — это построение масштабируемых систем обработки данных, которые служат основой для бизнес-аналитики и ML моделей.

Этапы карьеры

Первый этап (2014-2016): Hadoop & MapReduce

В первой компании работал с Hadoop кластерами на 20+ серверов. Писал MapReduce jobs на Java для обработки логов веб-сервисов. Тогда всё было медленно и больно. Узнал на практике, почему in-memory обработка нужна.

Второй этап (2016-2018): Spark & Scala

Перевод на Apache Spark был игровой момент. Сразу ощутил преимущество in-memory вычислений — одни и те же job-ы выполнялись в 10 раз быстрее. Перешёл на Scala для production кода.

За этот период:

  • Оптимизировал Spark jobs используя эффективное партиционирование
  • Реализовал incremental processing для daily feeds
  • Разработал мониторинг падения performance
Читать полностью ->
Как объединить два SELECT-запроса?
1.6 Junior🔥 28💬 1

Объединение двух SELECT-запросов

В SQL существует несколько способов объединить результаты двух SELECT-запросов. Выбор метода зависит от структуры данных, взаимосвязи таблиц и типа объединения.

1. UNION и UNION ALL

UNION объединяет результаты двух запросов, удаляя дубликаты.

SELECT id, name, role FROM employees WHERE department = "Sales"
UNION
SELECT id, name, role FROM managers WHERE status = "active";

UNION ALL объединяет результаты, сохраняя дубликаты (быстрее, чем UNION).

SELECT id, name, amount FROM transactions_2024
UNION ALL
SELECT id, name, amount FROM transactions_2025;

Требования для UNION:

  • Одинаковое количество колонок
  • Совместимые типы данных
  • Имена колонок берутся из первого SELECT

2. JOIN (внутреннее объединение таблиц)

Если две таблицы имеют общий ключ, используй JOIN.

INNER JOIN возвращает только совпадающие строки:

Читать полностью ->
Расскажи про последнее место работы
1.0 Junior🔥 28💬 1

Последнее место работы: FinTech стартап (2022-2024)

Компания и контекст

Компания: PayFlow — финтех платформа для микро-кредитования через мобильное приложение. Серия B раунд, ~50 человек, 15 в техе.

Моя роль: Senior Data Engineer (вторая в команде DE после Lead).

Команда: 1 Lead Data Engineer + я + 1 Junior + 2 Аналитика

Ответственности

1. Архитектура Data Pipeline

Построил систему обработки финансовых данных:

  • Источники: Mobile app (100K+ DAU), Banking API (интеграция с 5+ банков), Kafka очереди (real-time events)
  • Процесс: Kafka → Spark Structured Streaming → Data Lake (S3) → BigQuery
  • Объём: ~2TB данных в месяц, 500B+ events в день

Основные DAG в Airflow:

  • ingest_raw_events — загрузка raw данных каждые 5 минут
  • transform_to_silver — cleaning, validation, deduplication
  • build_analytics_warehouse — OLAP cube для дашбордов
  • feature_engineering — подготовка features для ML моделей

2. Real-time Analytics

Читать полностью ->
Какие системы управления зависимостями (pip, poetry) использовал?
1.0 Junior🔥 27💬 1

Системы управления зависимостями в Python

1. pip — встроенный менеджер пакетов

Что это: Стандартный инструмент для установки Python пакетов из PyPI (Python Package Index)

Как использовать:

# Установка пакета
pip install pandas numpy scikit-learn

# Установка конкретной версии
pip install pandas==1.5.0

# Установка диапазона версий
pip install "pandas>=1.0,<2.0"

# Установка из файла requirements.txt
pip install -r requirements.txt

# Создание requirements.txt
pip freeze > requirements.txt

Плюсы:

  • ✅ Встроен в Python (не нужно устанавливать)
  • ✅ Простой и быстрый
  • ✅ Огромное количество пакетов на PyPI
  • ✅ Хорошая документация

Минусы:

  • ❌ Не решает проблему dependency hell (разные версии разных пакетов конфликтуют)
  • ❌ Нет lock-файла (требуется pip freeze, но это ненадежно)
  • ❌ Плохо работает с virtual environments (нужно ручное управление)
  • ❌ Медленный для больших проектов
Читать полностью ->
Как называется структура задач в Airflow?
1.6 Junior🔥 27💬 1

Структура задач в Airflow

В Apache Airflow вся иерархия организации работ строится на DAG (Directed Acyclic Graph) — это основная концепция, которая определяет как задачи организуются, распределяются и выполняются.

DAG — Directed Acyclic Graph

DAG — это основная структурная единица в Airflow. Это ориентированный ациклический граф, который описывает:

  • Набор задач (tasks)
  • Зависимости между ними
  • Порядок выполнения
from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime

with DAG(
    dag_id="my_first_dag",
    start_date=datetime(2024, 1, 1),
    schedule_interval="@daily",
    catchup=False
) as dag:
    pass

Основные компоненты DAG

1. DAG ID Уникальный идентификатор DAG'а в Airflow.

2. Task (Задача) Отдельная единица работы, обычно один оператор.

from airflow.operators.bash import BashOperator
Читать полностью ->
Чем занимался?
1.3 Junior🔥 26💬 1

Мой опыт как Data Engineer

В своей карьере я занимался проектированием и разработкой полного цикла data pipeline, от сбора данных до аналитики и машинного обучения.

ETL и Data Pipelines

# Разработка критичных ETL процессов
from airflow import DAG
from airflow.operators.python import PythonOperator
from datetime import datetime, timedelta

default_args = {
    "owner": "data-eng",
    "retries": 3,
    "retry_delay": timedelta(minutes=5),
}

dag = DAG(
    "daily_sales_etl",
    default_args=default_args,
    schedule_interval="0 2 * * *",  # 2 AM ежедневно
    start_date=datetime(2023, 1, 1),
)
Читать полностью ->
Какие инструменты использовал для обработки данных в pipeline?
2.0 Middle🔥 26💬 1

Инструменты для обработки данных в Data Pipeline

Обзор экосистемы

Современный Data Engineer работает с разнообразным стеком инструментов, каждый из которых решает конкретную задачу в pipeline обработки данных. Вот наиболее популярные и практичные решения.

1. Инструменты для Extraction (Извлечение данных)

Apache NiFi

Основное назначение: Low-code платформа для маршрутизации и трансформации данных
Преимущества:
- Визуальный интерфейс (drag-and-drop)
- Гарантированная доставка (guaranteed delivery)
- Встроенные процессоры для интеграции
- Работает с разными источниками (FTP, HTTP, databases)

Пример использования:
FTP Server → HTTP API → Email extraction → Kafka

Apache Kafka / Pulsar

Основное назначение: Streaming распределённой очереди сообщений
Преимущества:
- Масштабируемость (partition по ключам)
- Персистентность (сохранение в HDFS)
- Replay возможность
- Low latency

Пример:
from kafka import KafkaProducer, KafkaConsumer
Читать полностью ->
Какие знаешь встроенные структуры данных в Python?
1.6 Junior🔥 26💬 1

Встроенные структуры данных в Python

Структуры данных — это фундамент Python программирования. Каждая из них имеет свои характеристики по производительности, использованию памяти и семантике. Data Engineer должен выбирать оптимальную структуру для каждой задачи.

1. List (список)

List — упорядоченная, изменяемая коллекция с возможностью содержать элементы любого типа.

# Создание
my_list = [1, 2, 3, 'hello', 4.5]
empty_list = []
list_from_range = list(range(10))

# Основные операции
my_list.append(5)  # O(1) amortized
my_list.insert(1, 'new')  # O(n)
my_list.extend([6, 7])  # O(k) где k - размер добавляемого списка
my_list.pop()  # O(1) - удаляет последний
my_list.pop(0)  # O(n) - удаляет первый
my_list.remove(2)  # O(n)

# Производительность
# Доступ по индексу: O(1)
first = my_list[0]
last = my_list[-1]

# Поиск элемента: O(n)
index = my_list.index(3)

# Сложность
print(len(my_list))  # O(1)
print(3 in my_list)  # O(n)
Читать полностью ->
Какова роль NameNode в Hadoop и какие проблемы с ним связаны?
3.0 Senior🔥 25💬 2

NameNode в Hadoop и его роль

NameNode — это главный компонент распределённой файловой системы Hadoop (HDFS), который управляет всей файловой системой. Это критический компонент инфраструктуры Big Data, и его отказ может привести к неработоспособности всего кластера.

Роль NameNode в HDFS

1. Управление файловой системой

NameNode хранит и управляет файловой иерархией и метаданными всех файлов в HDFS:

Читать полностью ->
Сколько будет выполнтся поиск по индексу в бд?
1.3 Junior🔥 25💬 1

Время выполнения поиска по индексу

Сложность в Big O нотации

Поиск по индексу выполняется за O(log N) — логарифмическое время.

где N — количество строк в таблице.

Пример расчёта

Для B-Tree индекса (самый распространённый)

Таблица с 1 млн строк:
log₂(1,000,000) ≈ 20 дисковых операций

Таблица с 1 млрд строк:
log₂(1,000,000,000) ≈ 30 дисковых операций

Таблица с 1 трлн строк:
log₂(1,000,000,000,000) ≈ 40 дисковых операций

Реальные времена

При условии:

  • B-Tree индекс (PostgreSQL, MySQL)
  • SSD диск (типичный в облаке)
  • 8 KB блок (default)
  • Условие на одну колонку: WHERE id = 123
10 строк → 0.001 ms (в памяти)
1000 строк → 0.01 ms
100K строк → 0.1 ms
1M строк → 1 ms
10M строк → 2 ms
100M строк → 3 ms
1B строк → 4 ms

Сравнение: индекс vs полное сканирование

Для таблицы с 100M строк:

Полное сканирование (Full Scan):
100M строк * 0.001 ms = 100 секунд

Поиск по индексу (Index Scan):
log₂(100M) = 27 операций * 0.1 ms = 2.7 ms
Читать полностью ->
Может ли класс в Python иметь несколько методов инициализации?
1.0 Junior🔥 25💬 1

Несколько методов инициализации в Python

Прямой ответ

В Python класс может иметь только один метод __init__, который вызывается при создании экземпляра. Однако существуют мощные способы реализовать логику "множественной инициализации" через альтернативные конструкторы и гибкие параметры.

Почему только один __init__?

__init__ — специальный метод (dunder method), вызываемый автоматически после __new__. При определении нескольких методов с одинаковым именем последний просто перезаписывает предыдущие:

class Person:
    def __init__(self, name):
        self.name = name
    
    def __init__(self, age):  # Это перезапишет первый __init__!
        self.age = age

# Только второй __init__ сохранится
person = Person(30)  # Работает
person = Person("Alice")  # TypeError

Решение 1: Альтернативные конструкторы через @classmethod

Самый элегантный способ:

from datetime import datetime
Читать полностью ->
Каким образом декомпозировать широкую таблицу на сателлиты в Data Vault?
2.3 Middle🔥 25💬 2

Каким образом декомпозировать широкую таблицу на сателлиты в Data Vault

Data Vault — методология, где таблицы разделяются на Hubs (сущности), Links (связи) и Satellites (атрибуты).

1. Проблема: Широкая таблица

Исходная таблица customers:

CREATE TABLE customers_raw (
    customer_id INT PRIMARY KEY,
    name VARCHAR,
    email VARCHAR,
    phone VARCHAR,
    address VARCHAR,
    city VARCHAR,
    zip_code VARCHAR,
    country VARCHAR,
    registration_date DATE,
    last_login DATE,
    subscription_type VARCHAR,
    subscription_start DATE,
    subscription_end DATE,
    billing_address VARCHAR,
    billing_city VARCHAR,
    payment_method VARCHAR,
    card_number VARCHAR,
    preferred_language VARCHAR,
    marketing_opted_in BOOLEAN,
    created_at TIMESTAMP,
    updated_at TIMESTAMP
);

Проблемы:

  • Сложно отследить изменения атрибутов
  • Нет истории — переписываются данные
  • Сложность в обслуживании
  • Трудно понять, какой атрибут меняется часто
Читать полностью ->
Как управлять утечками памяти в Python?
1.0 Junior🔥 25💬 1

Как управлять утечками памяти в Python

Введение

Утечка памяти — это ситуация, когда объекты остаются в памяти даже после того, как они больше не нужны. Python имеет сборщик мусора (Garbage Collector), но это не гарантирует отсутствие утечек. Data Engineer'ы часто сталкиваются с утечками памяти при обработке больших объёмов данных.

1. Причины утечек памяти в Python

Циклические ссылки

# ПЛОХО: циклические ссылки
class Node:
    def __init__(self, value):
        self.value = value
        self.next = None
        self.parent = None

# Создаём циклическую ссылку
node1 = Node(1)
node2 = Node(2)
node1.next = node2
node2.parent = node1  # Циклическая ссылка! Даже если удалим node1 и node2, они не будут удалены

del node1, node2  # Переменные удалены, но объекты остаются в памяти

Почему это проблема: Python GC может справиться с циклическими ссылками, но есть задержка.

Глобальные переменные и кэши

Читать полностью ->
Как выяснить требования у нетехнического заказчика?
2.0 Middle🔥 25💬 1

Выявление требований у нетехнического заказчика

Основной принцип: слушание и переформулирование

Нетехнический заказчик часто не знает, что такое pipeline, ETL или хранилище данных. Ваша задача — перевести его бизнес-проблемы в технические требования.

Шаг 1: Поймите бизнес-проблему

Вопросы, которые нужно задать:

  1. Почему вы пришли с этой проблемой?

    • Заказчик: «Наша аналитика работает медленно»
    • Data Engineer: «Сколько эта медленность вас стоит? Часы ожидания результата значит потерянные решения?»
  2. Какой результат вы хотите получить?

    • Заказчик: «Хотим видеть данные по продажам»
    • Data Engineer: «Вы хотите видеть: sales by region/product/time? Нужны детали каждого заказа или только сводки?»
  3. Кто будет использовать решение?

    • Менеджер (нужны красивые dashboards)
    • Аналитик (нужен SQL доступ)
    • Руководитель (нужны только KPI)
    • Каждому требуется свой интерфейс

Шаг 2: Выясните масштабы

Читать полностью ->
Зачем нужен DWH?
1.0 Junior🔥 25💬 1

Зачем нужен Data Warehouse (DWH)

Определение

Data Warehouse (DWH) — это централизованное хранилище данных, оптимизированное для аналитических запросов, созданное путём интеграции данных из множества источников. Это НЕ то же самое, что операционная БД.

Проблема без DWH

Представь e-commerce платформу с несколькими источниками данных:

┌─────────────────┐
│ MySQL: Orders   │ (OLTP)
├─────────────────┤
│ PostgreSQL: CRM │ (OLTP)
├─────────────────┤
│ MongoDB: Logs   │ (NoSQL)
├─────────────────┤
│ S3: Events      │ (Raw data)
└─────────────────┘

Аналитик хочет выполнить запрос: "Какая выручка от пользователей старше 30 лет по регионам за последние 30 дней?"

Без DWH:

  • Нужно писать сложный JOIN через 4 разные системы
  • Каждый запрос бьёт по боевым операционным БД (снижает performance)
  • Нет истории данных (кто удалит запись из MySQL — она пропадёт)
  • Разные форматы данных, разные временные зоны
  • Каждый аналитик создаёт свой ненадёжный скрипт
Читать полностью ->
Как работают индексы в базах данных?
1.2 Junior🔥 25💬 1

Индексы в базах данных: основные концепции и применение

Индексы — это структуры данных, которые ускоряют поиск и выборку данных из таблиц. Я активно использую индексы при проектировании баз данных и оптимизации запросов.

Как работают индексы

Индекс — это отсортированная структура данных, которая хранит значения столбца(ов) и указатели на соответствующие строки таблицы. Вместо полного сканирования таблицы (Full Table Scan), база данных может перейти напрямую к нужным строкам.

B-Tree индекс (наиболее распространённый)

Большинство СУБД используют B-Tree структуры:

  • Сбалансированное дерево, оптимизированное для дисковых операций
  • Каждый узел содержит несколько ключей и указателей
  • Высота дерева логарифмическая, поэтому поиск очень быстрый
  • Хранится на диске, как и основная таблица
Читать полностью ->
В каком стиле писал код на Python и какие технологии использовал
1.0 Junior🔥 25💬 1

Python код, стиль и технологии в моей работе

За 10+ лет я эволюционировал от грязного скрипта-spaghetti к production-grade коду. Вот мой подход и инструменты.

1. Стиль кодирования

От беспорядка к чистоте

# ДО (2010-е годы) — спагетти
def load_data():
    import pandas
    import sqlalchemy
    # Всё в одной функции
    df = pandas.read_csv('data.csv')
    # Нет обработки ошибок
    conn = sqlalchemy.create_engine('postgresql://...')
    for idx, row in df.iterrows():
        # Медленно
        conn.execute(f"INSERT INTO table VALUES ({row})")
    # Нет логирования
    return True

# СЕЙЧАС — clean code
from dataclasses import dataclass
from typing import Iterator
import logging

logger = logging.getLogger(__name__)

@dataclass
class DataLoadConfig:
    """Configuration for data loading"""
    source_path: str
    target_schema: str
    batch_size: int = 5000
    validate: bool = True
Читать полностью ->
В какой СУБД большой опыт
1.0 Junior🔥 25💬 1

Основные СУБД в моей практике

За 10+ лет работы я получил глубокий опыт с несколькими категориями баз данных, каждая из которых решает специфические задачи в экосистеме data engineering.

PostgreSQL — фундамент

PostgreSQL остаётся моей основной СУБД для structured data. С этой БД я работаю больше всего:

  • Проектирование schema с нормализацией (3NF, BCNF)
  • Оптимизация запросов через EXPLAIN ANALYZE
  • Индексирование: B-tree, Hash, GiST, BRIN для больших таблиц
  • Партиционирование по времени и диапазонам
  • Window functions для аналитики
  • Common Table Expressions (CTE) для сложной логики
WITH user_stats AS (
  SELECT user_id, COUNT(*) as event_count,
    ROW_NUMBER() OVER (ORDER BY user_id) as rank
  FROM events
  WHERE date >= NOW() - INTERVAL '30 days'
  GROUP BY user_id
)
SELECT * FROM user_stats WHERE rank <= 1000;

Apache Spark + PySpark — распределённая обработка

Spark использую для ETL на больших объёмах (сотни ГБ-ТБ):

Читать полностью ->
В чем разница между Data Warehouse и Data Lake?
1.3 Junior🔥 25💬 1

Data Warehouse vs Data Lake: Полное сравнение

Быстрый ответ

Data Warehouse — это структурированное хранилище с заранее определённой схемой (Schema-on-Write). Data Lake — это сырое хранилище любых данных без предварительной структуризации (Schema-on-Read).

Детальное сравнение

Data Warehouse (хранилище данных)

Определение: Централизованная база данных, оптимизированная для аналитики и отчётности на основе структурированных данных.

Характеристики:

  • Schema-on-Write: структура определяется ДО загрузки данных
  • Структурированные данные: табличный формат (SQL)
  • ETL-ориентированный: требует трансформации перед загрузкой
  • Быстрые запросы: индексирование и оптимизация для SELECT
  • Дорого: требует предварительной подготовки и хранилища

Примеры:

  • Redshift
  • Snowflake
  • BigQuery
  • Teradata

Data Lake (озеро данных)

Определение: Хранилище сырых данных любого типа и формата для их последующей обработки.

Читать полностью ->
Что происходит под капотом при выполнении shuffle в Spark?
2.7 Senior🔥 24💬 1

Shuffle в Apache Spark: детальный анализ

Shuffle — это одна из самых дорогих операций в Spark, которая перемещает данные между worker-нодами. Понимание того, как shuffle работает под капотом, критично для оптимизации производительности. Разберу этот механизм детально.

Что такое shuffle?

Определение: Shuffle — это процесс перераспределения данных между нодами кластера в зависимости от значения ключа. Это происходит при операциях вроде GROUP BY, JOIN, DISTINCT.

Операции, которые вызывают shuffle

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("shuffle_example").getOrCreate()
df = spark.read.parquet("s3://data/sales")

# Все эти операции ВЫЗЫВАЮТ shuffle:

# 1. GROUP BY
df.groupBy("category").sum("amount").collect()  # shuffle по category

# 2. JOIN
df1 = spark.read.parquet("s3://data/table1")
df2 = spark.read.parquet("s3://data/table2")
df1.join(df2, on="key", how="inner")  # shuffle по key
Читать полностью ->
Что такое Primery key?
1.6 Junior🔥 24💬 1

Что такое Primary Key

Primary Key (первичный ключ) — это один или несколько столбцов в таблице БД, которые уникально идентифицируют каждую строку. Это основной механизм для обеспечения уникальности и целостности данных.

Основные характеристики Primary Key

  • Уникальность — каждое значение в PK столбце(ах) должно быть уникальным
  • NOT NULL — значение не может быть пустым
  • Только один PK на таблицу — хотя PK может состоять из нескольких столбцов (составной ключ)
  • Индекс — БД автоматически создаёт индекс на PK для быстрого поиска
  • Ссылка для внешних ключей — другие таблицы ссылаются на PK через Foreign Key

Примеры Primary Key

1. Простой Primary Key (один столбец)

CREATE TABLE users (
    user_id INT PRIMARY KEY,
    name VARCHAR(100) NOT NULL,
    email VARCHAR(100) UNIQUE
);

2. Составной Primary Key (несколько столбцов)

Читать полностью ->
Как создавать и публиковать свои пакеты на Python?
1.3 Junior🔥 24💬 1

Создание и публикация Python пакетов

Отличный вопрос про production-ready инструменты для распределения кода. Расскажу от нуля до PyPI.

Шаг 1: Структура пакета

Минимальная структура:

my_data_package/
├── setup.py                 # Конфигурация пакета (старый способ)
├── pyproject.toml          # Новый способ (PEP 517, 518)
├── README.md               # Описание
├── LICENSE                 # MIT, Apache, etc.
├── requirements.txt        # Зависимости для разработки
├── my_data_package/        # Основной пакет (директория с __init__.py)
│   ├── __init__.py
│   ├── core.py
│   ├── utils.py
│   └── dataframes.py
└── tests/                  # Тесты
    ├── __init__.py
    ├── test_core.py
    └── test_utils.py

Что такое __init__.py?

# my_data_package/__init__.py

__version__ = '0.1.0'
__author__ = 'Your Name'

# Экспортируем главные функции для удобства
from .core import process_data, transform_dataframe
from .utils import validate_input
Читать полностью ->
Какие знаешь неизменяемые типы данных?
1.0 Junior🔥 24💬 1

Проблемы при доставке данных (Data Delivery Issues)

Data delivery — это критичный процесс в data engineering, где данные передаются от источников к целевым системам (data warehouse, озёра данных, аналитикам). Множество проблем могут привести к потере, задержке или нарушению целостности данных.

1. Проблемы целостности данных

Дублирование данных

-- Проблема: при retry могут загрузиться дубли
-- Решение: использовать UNIQUE constraint и idempotency

CREATE TABLE events_deduplicated (
    event_id UUID PRIMARY KEY,
    user_id UUID,
    event_type VARCHAR(50),
    timestamp TIMESTAMP,
    data JSONB
);

-- Или через ON CONFLICT
INSERT INTO events_deduplicated (event_id, user_id, event_type, timestamp, data)
VALUES (:event_id, :user_id, :event_type, :timestamp, :data)
ON CONFLICT (event_id) DO NOTHING;  -- пропускаем дубли

-- Обнаружение дублей
SELECT user_id, COUNT(*) as cnt
FROM events_deduplicated
GROUP BY user_id
HAVING COUNT(*) > 1;

Потеря данных

Читать полностью ->
Какие типы ключей используются в SQL?
1.0 Junior🔥 24💬 1

Типы ключей в SQL: полный обзор и применение

Ключи в SQL — это критический компонент проектирования баз данных. Я использую разные типы ключей для обеспечения целостности данных, оптимизации запросов и построения корректных отношений между таблицами.

1. Primary Key (Первичный ключ)

Определение: уникальный идентификатор каждой записи в таблице. Не может быть NULL.

CREATE TABLE users (
    user_id BIGINT PRIMARY KEY,      -- Первичный ключ
    email VARCHAR(255) NOT NULL,
    username VARCHAR(100) NOT NULL
);

-- Или альтернативный синтаксис
CREATE TABLE users (
    user_id BIGINT,
    email VARCHAR(255) NOT NULL,
    username VARCHAR(100) NOT NULL,
    PRIMARY KEY (user_id)
);

-- Составной первичный ключ (composite primary key)
CREATE TABLE user_preferences (
    user_id BIGINT,
    preference_key VARCHAR(100),
    preference_value TEXT,
    PRIMARY KEY (user_id, preference_key)  -- Комбинация уникальна
);
Читать полностью ->
Какие есть важные термины при масштабировании записи в Kafka?
2.0 Middle🔥 24💬 1

Важные термины при масштабировании записи в Kafka

Масштабирование записи (write scalability) — это критический аспект при работе с Kafka как с платформой для обработки большого объёма данных. Важно понимать ключевые термины и концепции.

1. Throughput (пропускная способность)

Throughput — это количество сообщений или данных, которые Kafka может обработать в единицу времени:

# Пример: измерение throughput
import time
from kafka import KafkaProducer
import json

producer = KafkaProducer(
    bootstrap_servers=['localhost:9092'],
    acks='all',  # Ждём подтверждения от всех
    value_serializer=lambda x: json.dumps(x).encode('utf-8')
)

messages_sent = 0
start_time = time.time()
Читать полностью ->
Какие Python-фреймворки использовал?
1.0 Junior🔥 24💬 1

Python-фреймворки для Data Engineer

During my career as Data Engineer with 10+ years of experience, I've worked with diverse Python frameworks and libraries. Let me break down the most relevant ones for data engineering tasks.

Web Frameworks (для APIs и сервисов)

FastAPI

Когда я использовал: REST API для ETL pipeline orchestration, data endpoints, webhook handlers

from fastapi import FastAPI, HTTPException
from pydantic import BaseModel

app = FastAPI()

class DataQuery(BaseModel):
    table: str
    filters: dict

@app.post("/query")
async def execute_query(query: DataQuery):
    try:
        result = db.fetch_data(query.table, query.filters)
        return {"status": "success", "data": result}
    except Exception as e:
        raise HTTPException(status_code=400, detail=str(e))

# Достоинства: Автоматическая валидация, OpenAPI docs, async support
# Недостатки: Требует async/await для full performance
Читать полностью ->
Что в OLAP бд используется вместо индексов для оптимизации поиска?
1.0 Junior🔥 24💬 1

Что в OLAP БД используется вместо индексов для оптимизации поиска?

В OLAP (Online Analytical Processing) базах данных используются совершенно другие подходы к оптимизации поиска, чем в традиционных OLTP системах. Вместо индексов применяются специализированные техники, оптимизированные для аналитических запросов с полными сканированиями больших объёмов данных.

1. Agregation (Агрегация и предвычисление)

Это основной метод оптимизации в OLAP.

Вместо индексов OLAP БД используют предвычисленные агрегации (fact tables с различными уровнями гранулярности).

-- Исходная детальная таблица (fact table)
CREATE TABLE sales_detail (
    transaction_id INT,
    product_id INT,
    customer_id INT,
    store_id INT,
    date_id INT,
    amount DECIMAL(10, 2)
);
-- Размер: 10 миллиардов строк, 1 TB
Читать полностью ->
Какие делал бы типы проверок качества данных?
2.0 Middle🔥 24💬 1

Проверки качества данных (Data Quality Checks): стратегия и реализация

Проверка качества данных — критическая часть работы Data Engineer. Я внедряю многоуровневый подход для обеспечения надёжности data pipelines.

Основные категории проверок

1. Проверки полноты данных (Completeness)

Проверяют, что нет критических пропусков:

import pandas as pd
from datetime import datetime
Читать полностью ->
Чем отличается пакет от модуля в Python?
1.0 Junior🔥 23💬 1

Пакет vs Модуль в Python: ключевые различия

В Python это два часто путаемых понятия, которые важны для организации кода в Data Engineering проектах.

Что такое модуль

Модуль — это один файл с расширением .py, содержащий Python код.

my_project/
├── utils.py          # ← это модуль
├── data_loader.py    # ← это модуль
└── main.py           # ← это модуль

Пример модуля:

# utils.py — это модуль
def calculate_mean(data):
    """Вычисляет среднее значение"""
    return sum(data) / len(data)

def calculate_std(data):
    """Вычисляет стандартное отклонение"""
    mean = calculate_mean(data)
    variance = sum((x - mean) ** 2 for x in data) / len(data)
    return variance ** 0.5

CONSTANT = 42

Использование модуля:

# main.py
import utils  # импортируем модуль
Читать полностью ->
Как с помощью airflow пересчитать витрины?
2.0 Middle🔥 23💬 1

Пересчёт витрин в Airflow

Что такое витрины и зачем их пересчитывать

Витрины — это агрегированные представления данных, оптимизированные для быстрого доступа и аналитики. Они содержат суммированные, сгруппированные или трансформированные данные из фактических таблиц.

Причины пересчёта витрин:

  • Обновление исходных данных
  • Обнаружение ошибок в логике калькуляции
  • Изменение бизнес-метрик
  • Восстановление данных после сбоя
  • Переход на новую версию ETL логики

Стратегии пересчёта витрин

1. Полный пересчёт (Full Recalculation)

Когда использовать: для небольших витрин или критичных метрик

from airflow import DAG
from airflow.operators.python import PythonOperator
from airflow.providers.postgres.operators.postgres import PostgresOperator
from datetime import datetime, timedelta

default_args = {
    "owner": "data-team",
    "start_date": datetime(2024, 1, 1),
    "retries": 1,
    "retry_delay": timedelta(minutes=5),
}
Читать полностью ->
Какие бывают ключи в SQL?
1.0 Junior🔥 23💬 1

Типы ключей в SQL

Определение

Ключ — это атрибут или комбинация атрибутов, которые уникально идентифицируют запись в таблице или устанавливают связь между таблицами. Ключи — фундамент нормализации БД и обеспечивают целостность данных.

1. Primary Key (Первичный ключ)

Определение: Уникально идентифицирует каждую строку в таблице. В таблице может быть только один primary key.

Характеристики:

  • Не может содержать NULL значения
  • Каждое значение уникально
  • Часто используется для связей с другими таблицами
  • СУБД автоматически создаёт индекс на primary key
CREATE TABLE users (
    user_id INT PRIMARY KEY,
    name VARCHAR(100),
    email VARCHAR(100)
);

-- Или альтернативный синтаксис
CREATE TABLE orders (
    order_id INT,
    user_id INT,
    order_date DATE,
    PRIMARY KEY (order_id)
);
Читать полностью ->
Что такое deadlock в SQL?
1.0 Junior🔥 22💬 1

Что такое deadlock в SQL?

Deadlock (тупик) — это ситуация, когда две или более транзакции ждут друг друга, создавая циклическую зависимость, и ни одна из них не может продолжить выполнение. В результате все вовлечённые транзакции зависают бесконечно, пока СУБД не вмешается и не прерывает одну из них.

Классический сценарий deadlock

Представь две транзакции:

Транзакция 1:
1. Блокирует строку A
2. Пытается заблокировать строку B → ЖДЁТ

Транзакция 2:
1. Блокирует строку B
2. Пытается заблокировать строку A → ЖДЁТ

Транзакция 1 ждёт, пока Транзакция 2 освободит B, но Транзакция 2 ждёт, пока Транзакция 1 освободит A. Получается замкнутый цикл — deadlock.

SQL пример deadlock

-- Сессия 1
BEGIN TRANSACTION;
UPDATE orders SET amount = 1000 WHERE order_id = 1;
-- ... блокирует строку с order_id = 1

UPDATE orders SET amount = 2000 WHERE order_id = 2;
-- ... пытается заблокировать order_id = 2 (может ждать)
Читать полностью ->
Какая стандартная репликация в HDFS и на что она влияет?
1.6 Junior🔥 22💬 1

HDFS репликация: стандарты и влияние

HDFS (Hadoop Distributed File System) использует репликацию данных для обеспечения надёжности и доступности. Понимание репликации критично для production систем.

Стандартный фактор репликации

По умолчанию HDFS хранит 3 копии каждого блока данных (replication factor = 3).

# Просмотр текущего фактора репликации
hdfs dfs -ls -R /path/to/file

# Изменение репликации для файла
hdfs dfs -setrep 2 /path/to/file

# Изменение для директории и рекурсивно
hdfs dfs -setrep -R 3 /data/

Архитектура размещения

Стандартная схема размещения 3 реплик:

Rack-aware placement:

  • Replica 1: Узел, где находится writer
  • Replica 2: Другой узел в том же rack
  • Replica 3: Узел в другом rack

Очень редко: узел, но другой Rack

Это обеспечивает баланс между надёжностью (разные racks) и производительностью (близкие узлы).

Конфигурация в hdfs-site.xml

Читать полностью ->
Как найти причину падения конверсии на 10%?
2.0 Middle🔥 22💬 1

Как найти причину падения конверсии на 10%

1. Определи точку падения

Первое — когда именно произошло падение. Проанализируй график конверсии по дням:

-- Дневная конверсия
SELECT 
    DATE(order_date) as date,
    COUNT(DISTINCT user_id) as users,
    COUNT(*) as orders,
    ROUND(COUNT(*) * 100.0 / COUNT(DISTINCT user_id), 2) as conversion_pct
FROM events
WHERE event_type IN ('view_product', 'order')
GROUP BY DATE(order_date)
ORDER BY date DESC
LIMIT 60;

Если конверсия упала 10% в конкретный день → проверь, что произошло в тот день (деплой, маркетинг, внешние факторы).

Если падение градуальное → ищи дренаж через разные каналы.

2. Разбей по каналам (cohort analysis)

Конверсия может быть разной для разных групп пользователей:

Читать полностью ->
Как вызвать метод родительского класса через super()?
1.3 Junior🔥 22💬 1

Использование super() для вызова методов родительского класса в Python

Что такое super()

super() — встроенная функция Python, которая возвращает объект-посредник, позволяющий вызывать методы родительского (супер) класса. Это критично для корректной работы наследования и множественного наследования.

Синтаксис и использование

Python 3 (современный синтаксис):

class Parent:
    def method(self):
        print("Родительский метод")

class Child(Parent):
    def method(self):
        super().method()  # Вызываем родительский метод
        print("Детский метод")

child = Child()
child.method()
# Результат:
# Родительский метод
# Детский метод

Python 2 (старый синтаксис, для совместимости):

class Parent(object):  # Обязательно наследовать от object
    def method(self):
        print("Родительский метод")

class Child(Parent):
    def method(self):
        super(Child, self).method()  # Полная форма
        print("Детский метод")
Читать полностью ->
Для чего используется кортеж (tuple) в Python?
1.0 Junior🔥 22💬 1

Кортежи (Tuples) в Python

Определение и назначение

Кортеж (tuple) — это неизменяемая (immutable) последовательность элементов в Python. В отличие от списков, содержимое кортежа нельзя изменить после создания.

Основные характеристики

Неизменяемость:

  • После создания элементы кортежа нельзя изменить
  • Обеспечивает безопасность данных и оптимизацию памяти

Хешируемость:

  • Кортежи можно использовать как ключи в словарях
  • Кортежи можно добавлять в множества (sets)
  • Списки нельзя использовать как ключи

Производительность:

  • Кортежи работают быстрее, чем списки
  • Занимают меньше памяти

Синтаксис создания

empty_tuple = ()
single_tuple = (42,)
user_data = ("Иван", 28, "Moscow", True)
colors = "red", "green", "blue"
from_list = tuple([1, 2, 3, 4])

Основные операции

user = ("Мария", 35, "SPB")
print(user[0])  # "Мария"
print(user[-1])  # "SPB"
print(user[1:])  # (35, "SPB")

name, age, city = user
print(name)  # "Мария"
Читать полностью ->
В чем разница между narrow (узкими) и wide (широкими) операциями в Apache Spark?
2.0 Middle🔥 22💬 1

Узкие и широкие операции в Apache Spark

Что это такое

Узкие операции (narrow transformations) — это трансформации, где каждая строка выходного RDD зависит только от одной строки входного RDD. Широкие операции (wide transformations) — это трансформации, где каждая строка выходного RDD может зависеть от множества строк входного RDD.

Эта классификация критична для понимания оптимизации Spark и управления памятью при обработке распределённых данных.

Узкие операции (Narrow Transformations)

Узкие операции выполняются в рамках одного stage без перетасовки данных между партициями.

Примеры узких операций:

  • map() — преобразование каждого элемента
  • filter() — фильтрация элементов
  • flatMap() — трансформация с раскрытием вложенных структур
  • select(), withColumn() — операции со столбцами в DataFrames
  • take() — получение первых N элементов

Пример кода:

from pyspark.sql import SparkSession
Читать полностью ->
В чем разница между kafka и RabbitMQ?
2.0 Middle🔥 22💬 1

Kafka vs RabbitMQ: ключевые различия

Оба решения служат для передачи сообщений между системами, но они разработаны с разными целями и архитектурными подходами. Понимание различий критично для выбора правильного инструмента.

Модель архитектуры

Kafka

  • Журнал событий (Event Log) — все сообщения хранятся в очередях как неизменяемый лог
  • Потребители отслеживают offset (позицию в логе)
  • Может быть очень много потребителей без влияния на производителей
  • Потребитель контролирует свой offset

RabbitMQ

  • Брокер сообщений (Message Broker) — сообщения проходят через очереди
  • Сообщение удаляется из очереди после подтверждения потребителем
  • Push-модель: брокер отправляет сообщения потребителям
  • Хранит сообщения временно до доставки

Производительность и масштабируемость

Читать полностью ->
Как обеспечить высокую доступность NameNode в Hadoop?
3.0 Senior🔥 21💬 1

Высокая доступность NameNode в Hadoop

Проблема: Single Point of Failure

NameNode — критический компонент Hadoop, который управляет файловой системой HDFS. Это единая точка отказа: если NameNode падает, весь кластер становится неработоспособным.

Решение: HA (High Availability) Architecture

1. Архитектура HA NameNode

Читать полностью ->
Что нужно делать когда нагрузка на бд становится слишком большая?
2.7 Senior🔥 21💬 1

Что делать когда нагрузка на БД становится слишком большая?

Это одна из ключевых задач Data Engineer. Когда БД перегружена, нужна система-матическая диагностика и применение скейлирующих решений в правильном порядке.

Шаг 1: Диагностика (измерение проблемы)

Сначала понимаешь, ЧТО перегружено и ПОЧЕМУ.

1.1. Какой ресурс исчерпан?

-- PostgreSQL: посмотреть основные метрики
SELECT 
  datname as database,
  numbackends as active_connections,
  tup_inserted + tup_updated + tup_deleted as mutations_per_sec,
  tup_fetched as reads_per_sec
FROM pg_stat_database
WHERE datname = 'production'
ORDER BY datname;

-- MySQL: текущие процессы
SHOW PROCESSLIST;

-- Redis: память
INFO memory
-- Результат: used_memory, maxmemory, evicted_keys (если много evictions)

1.2. Какие запросы медленные?

Читать полностью ->
Самый интересный кейс работы с SQL
1.8 Middle🔥 21💬 1

Самый интересный кейс работы с SQL: Аномалия в платежной системе

Контекст

Работал на проекте с платежной системой финтех-компании. Система обрабатывает 100 млн транзакций в день. В ноябре руководство заметило, что сумма всех платежей не совпадает с банковским отчётом — разница 3 млн рублей! Это критическая ошибка для compliance и бухгалтерии.

Поиск проблемы

День 1: Первые предположения

-- Проверяем базовую статистику
SELECT 
    COUNT(*) as total_transactions,
    SUM(amount) as total_amount,
    COUNT(DISTINCT merchant_id) as merchants,
    COUNT(DISTINCT customer_id) as customers
FROM transactions
WHERE DATE(created_at) = '2024-11-15';

-- Результат:
-- total_transactions: 45,234,123
-- total_amount: 1,234,567,890.00
-- merchants: 15,234
-- customers: 789,234

-- Но банк отчитался: 1,231,567,890.00
-- Разница: 3,000,000.00

День 1: Проверяем рефанды

Читать полностью ->
С какими NoSQL-базами работал
1.8 Middle🔥 21💬 1

Мой опыт работы с NoSQL-базами

Я работал с разными типами NoSQL баз в production. Расскажу про каждый, его плюсы/минусы и когда его использовать.

1. MongoDB (Document Database)

Опыт: 4 года в production, 100GB+ объёмы

Когда использовал:

  • Хранение user profiles (гибкая схема)
  • Events storage (JSON структуры разных типов)
  • Cache layer для быстрого доступа

Плюсы:

# Гибкость схемы
db.users.insertOne({
    "_id": 1,
    "name": "John",
    "email": "john@example.com",
    "preferences": {  # Nested documents
        "language": "en",
        "theme": "dark"
    },
    "tags": ["vip", "premium"]  # Arrays
})

# vs SQL: нужна была бы отдельная таблица для preferences

# Быстрый поиск по вложенным полям
db.users.find({"preferences.language": "en"})

Минусы:

# Отсутствие ACID транзакций (было до версии 4.0)
# Problematic: перевод денег (должна быть атомарность)
Читать полностью ->
Расскажи про виды индексов
1.3 Junior🔥 21💬 1

Виды индексов в базах данных

Индекс — это структура данных, которая ускоряет поиск информации в таблице. Подобно указателю в книге: вместо чтения всех страниц вы можете перейти на нужную по индексу.

Основная идея

-- Без индекса: полное сканирование таблицы O(n)
SELECT * FROM users WHERE id = 12345;
-- Проверяем все 1,000,000 строк

-- С индексом: бинарный поиск O(log n)
CREATE INDEX idx_users_id ON users(id);
SELECT * FROM users WHERE id = 12345;
-- Проверяем ~20 строк из 1,000,000

1. B-Tree индекс (B-Search Tree)

Самый универсальный и распространённый тип.

CREATE INDEX idx_users_email ON users(email);

Структура:

         [M]
        /   \
      [D]   [T]
     / \   / \
   [A][G][P][Z]

Дерево сбалансировано, глубина O(log n). Каждый узел может содержать несколько значений.

Преимущества:

  • Работает для диапазонов: WHERE age BETWEEN 18 AND 65
  • Сортировка: ORDER BY name
  • Быстрый поиск по точному значению
Читать полностью ->
Какие инструменты ETL использовал (Apache Airflow, Apache Spark)?
1.2 Junior🔥 21💬 1

ETL инструменты: Apache Airflow и Apache Spark

Это два ключевых инструмента в современной data engineering архитектуре. Они часто используются вместе: Airflow для оркестрации, Spark для обработки данных.

Apache Airflow

Что это? Airflow — это платформа для оркестрации (scheduling, monitoring) data pipelines. Определяешь DAG'и (Directed Acyclic Graphs), Airflow их выполняет.

Основные компоненты:

  • Scheduler — запускает DAG'и по расписанию
  • Executor — выполняет задачи (Local, Celery, Kubernetes)
  • Web UI — мониторинг и управление
  • MetaDatabase — хранит состояние DAG'ов и tasks

Когда использовать:

  • Scheduling тяжёлых jobs (daily, hourly)
  • Зависимости между tasks
  • Мониторинг и retry logic
  • Complex data pipelines с условиями

Пример простого DAG:

from airflow import DAG
from airflow.operators.python import PythonOperator
from airflow.operators.bash import BashOperator
from datetime import datetime
Читать полностью ->
Какие знаешь проверки качества данных?
1.8 Middle🔥 21💬 1

Проверки качества данных (Data Quality Checks)

Введение

Data Quality — это набор характеристик данных, определяющих их пригодность для использования: точность, полнота, консистентность, своевременность. Проверки качества — это автоматизированные тесты, которые гарантируют, что данные соответствуют ожиданиям.

1. Категории проверок качества данных

1.1 Проверка полноты (Completeness)

Убедиться, что данные не содержат неожиданные NULL или пропуски.

-- Проверка на отсутствие NULL в критичных полях
SELECT 
    COUNT(*) as total_rows,
    COUNT(customer_id) as non_null_customer_id,
    COUNT(*) - COUNT(customer_id) as missing_customer_id,
    ROUND(100.0 * COUNT(customer_id) / COUNT(*), 2) as completeness_percent
FROM orders;

-- Ожидание: completeness_percent > 99.5

Правила:

  • Все customer_id должны быть заполнены
  • Не более 0.5% NULL в order_date
  • Email должен быть не пустым для active пользователей
Читать полностью ->
Как работают генераторы в Python?
1.3 Junior🔥 21💬 1

Как работают генераторы в Python

Генераторы — это мощная и элегантная функция Python, которые позволяют создавать итераторы более удобным способом. Они являются основой для работы с большими объёмами данных, так как позволяют работать с данными лениво (по мере необходимости), а не загружать всё в память сразу.

Что такое генератор?

Генератор — это функция, которая содержит одно или несколько выражений yield. Когда такая функция вызывается, она возвращает генератор-объект, а не результат функции.

def simple_generator():
    yield 1
    yield 2
    yield 3

gen = simple_generator()
print(gen)  # <generator object simple_generator at 0x...>
print(type(gen))  # <class 'generator'>

Как работает генератор?

Шаг за шагом:

Читать полностью ->
В чем разница между PostgreSQL и Hive?
1.2 Junior🔥 21💬 1

Разница между PostgreSQL и Hive

Типы баз данных

PostgreSQL — это традиционная реляционная СУБД (RDBMS) с полной поддержкой ACID транзакций, предназначенная для онлайн-обработки (OLTP). Она хранит данные в структурированном виде с жёсткой схемой и идеально подходит для приложений, требующих надёжности и консистентности.

Hive — это распределённая система аналитики (OLAP) на основе Hadoop, которая работает поверх HDFS (Hadoop Distributed File System) и использует MapReduce или Spark для обработки больших объёмов данных. Hive переводит SQL-запросы в распределённые вычисления.

Архитектура и масштабируемость

PostgreSQL хранит данные в единой базе на одном или нескольких серверах с репликацией. Масштабирование вертикальное (увеличение мощности сервера) с ограничениями. Типичный объём данных: до нескольких терабайт.

Читать полностью ->
Какие типы join-операций существуют в Spark и когда применять каждый?
2.8 Senior🔥 20💬 1

Типы JOIN-операций в Apache Spark

JOIN — это одна из самых ресурсоёмких операций в Spark при работе с распределёнными данными. В Spark доступны различные стратегии JOIN-операций, каждая из которых подходит для разных сценариев. Выбор правильной стратегии критичен для производительности.

Основные типы JOIN в Spark

1. Broadcast Hash Join (BHJ)

Используется когда одна из таблиц достаточно маленькая, чтобы поместиться в памяти одного executora.

from pyspark.sql import SparkSession

spark = SparkSession.builder.appName("JoinExample").getOrCreate()

# Маленькая таблица размером < 100MB (по умолчанию)
small_df = spark.read.csv("path/to/small_table.csv", header=True)
large_df = spark.read.csv("path/to/large_table.csv", header=True)

# Broadcast join явный (рекомендуется)
from pyspark.sql.functions import broadcast

result = large_df.join(
    broadcast(small_df),
    large_df.id == small_df.id,
    "inner"
)
Читать полностью ->