Собес на middle-senior Data Инженер в ****

Доступно с премиум-подпиской

Оформите премиум-подписку, чтобы получить доступ к:

  • Фильтрации по компаниям
  • Названиям компаний в интервью
  • Видеозаписям собеседований в категории Data Инженер

Посмотреть видео в категории

(2025-11-24)

0. Часть. Intro

  • Рассказ о появлении Data департамента в Детском мире, текущих задачах, направлении развития и причинах срочного поиска сотрудника.

1. Часть. Теория

  • Hadoop
    • Из каких компонент состоит HDFS?
    • Что такое HDFS, Hadoop и Map Reduce?
    • Одно ли и тоже HDFS и Hadoop?
    • В чем разница?
    • Как работает?
    • Как работает каждая компонента hadoop?
    • Опыт в хостинге кластера hadoop?
    • Менеджеры ресурсов?
  • Spark
    • Что такое spark?
    • Что такое Spark Job?
    • Что такое stage?
    • Что такое task?
    • Разница job / stage / task?
    • Как строится план запроса?
    • Физически план?
    • Логичекий план?
    • Типы JOIN в Spark?
    • Физические Join?
    • Логические Join?
    • Подробнее про физические. Как они работают? В чем у них отличие друг от друга?
    • Можем ли мы управлять физическими типами join?
    • Какие есть способы запуска Spark приложения?
    • Что такое Spark Submit?
    • Отличие Cluster mode от Client mode?
    • Как определять "качество" spark задач?
    • Spill?
    • Shuffle?
    • Как работать с partition / repartition / coalesce? В чем у них разница?
    • Что такое партиция?
    • Что такое rdd / dataframe?
  • Airflow
    • Что такое airflow?
    • Из чего состоит airflow?
    • Какие я использовал операторы?
    • Что такое airflow sensor?
    • Что такое airflow trigger?
    • Опыт работы с сенсорами и триггерами? Писал ли я рукописные сенсоры и триггеры?
  • Python
    • Типы данных в питоне?
    • Изменяемые и неизменяемые типы?
    • Отличие неизменяемых и изменяемых типов?
    • Что может быть ключом словаря?
    • Функция hash()?
    • Наследование?

2. Задача SQL

Таблицы:

Client:

id name
1 Alice
2 Bob
3 Carol

Orders:

id client_id price
1 1 100
2 1 200
3 2 150
4 1 300
5 3 250
6 3 350

Вопрос:

  • Найти клиентов с максимальным кол-вом заказов? (*Сумму заказов)

Предложенные решения:

SELECT c.name
FROM Client c
JOIN (
    SELECT client_id, COUNT(*) as order_count
    FROM Orders
    GROUP BY client_id
) o ON c.id = o.client_id
WHERE o.order_count = (
    SELECT MAX(order_count)
    FROM (
        SELECT COUNT(*) as order_count
        FROM Orders
        GROUP BY client_id
    ) counts
);

WITH RankedClients AS (
    SELECT 
        c.name,
        COUNT(o.id) as order_count,
        RANK() OVER (ORDER BY COUNT(o.id) DESC) as rnk
    FROM Client c
    JOIN Orders o ON c.id = o.client_id
    GROUP BY c.id, c.name
)
SELECT name
FROM RankedClients
WHERE rnk = 1;

3. Задача Python

Вопрос:

  • Вычислить медиану списка из [int] значений.

Решение 1 (из файла питон 1 вариант.txt):

def median(arr):
    if not arr:
        return None
    
    sorted_arr = sorted(arr)
    n = len(sorted_arr)
    
    if n % 2 == 1:
        # Нечётное количество элементов
        return sorted_arr[n // 2]
    else:
        # Чётное количество элементов
        mid1 = sorted_arr[n // 2 - 1]
        mid2 = sorted_arr[n // 2]
        return (mid1 + mid2) / 2

# Тесты
arr1 = [1, 2, 3, 4]      # 2.5
arr2 = [1, 2, 5, 7, 8]   # 5

print(median(arr1))  # 2.5
print(median(arr2))  # 5

Решение 2 (из файла питон 2 вариант.txt):

import random

def quickselect(arr, k):
    """Находит k-й наименьший элемент в arr (0-based индекс)"""
    if len(arr) == 1:
        return arr[0]
    
    pivot = random.choice(arr)
    lows = [x for x in arr if x < pivot]
    highs = [x for x in arr if x > pivot]
    pivots = [x for x in arr if x == pivot]
    
    if k < len(lows):
        return quickselect(lows, k)
    elif k < len(lows) + len(pivots):
        return pivots[0]
    else:
        return quickselect(highs, k - len(lows) - len(pivots))

def median(arr):
    if not arr:
        return None
    
    n = len(arr)
    if n % 2 == 1:
        return quickselect(arr, n // 2)
    else:
        left = quickselect(arr, n // 2 - 1)
        right = quickselect(arr, n // 2)
        return (left + right) / 2

# Тесты
print(median([1, 2, 3, 4]))      # 2.5
print(median([1, 2, 5, 7, 8]))   # 5