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