**Компания:** ВК
**Контекст:** Бэкенд пишет логи в формате JSON Lines (по одному JSON-объекту на строку). Логи имеют вложенную структуру. Нужно распарсить их в плоскую таблицу для аналитики.
**Пример строки лога:**
[см. код в задании]
**Задание:**
1. Напишите функцию, которая читает JSON Lines файл и возвращает плоский DataFrame
2. Обработайте ситуации: битый JSON, отсутствующие поля
3. Добавьте столбец с датой (без времени) для партиционирования
Структура для ориентира — реальные значения из эталонного решения.
import json
import pandas as pd
from pathlib import Path
def parse_json_logs(filepath: str) -> tuple[pd.DataFrame, dict]:
"""Парсинг JSON Lines логов в плоский DataFrame."""
records = []
errors = {'parse_errors': 0, 'lines': []}
with open(filepath, 'r') as f:
for line_num, line in enumerate(f, 1):
line = line.strip()
if not line:
continue
try:
record = json.loads(line)
records.append(record)
except json.JSONDecodeError:
errors['parse_errors'] += 1
errors['lines'].append(line_num)
if not records:
return pd.DataFrame(), errors
# Развернуть вложенные объекты
df = pd.json_normalize(records, sep='_')
# Переименовать столбцы для удобства
rename_map = {
'user_id': 'user_id',
'user_platform': 'platform',
'params_page': 'page',
'params_load_time_ms': 'load_time_ms',
}
df = df.rename(columns=rename_map)
# Добавить столбец даты для партиционирования
df['ts'] = pd.to_datetime(df['ts'])
df['dt'] = df['ts'].dt.date
stats = {
'total_lines': len(records) + errors['parse_errors'],
'parsed': len(records),
'parse_errors': errors['parse_errors'],
'columns': list(df.columns),
}
return df, stats
JSON парсинг логи pandas flatten
Это задание для уровня easy. Senior-уровень — глубокое понимание темы, опыт решения нестандартных задач, обсуждение trade-off на собеседовании.
Подобные задания в категории «data_engineering» регулярно дают на собеседованиях аналитика данных в Яндекс, Сбер, Ozon, Авито, Тинькофф, Wildberries, T-Bank, X5, ВТБ и других крупных IT-компаниях. Тематика: JSON, парсинг, логи, pandas, flatten.
На реальном собеседовании на подобную задачу отводится 30-60 минут с обсуждением подходов, оптимизаций и trade-off. Для тренировки рекомендуем сначала решить самостоятельно, потом сверить с эталонным решением и подсказками.
На zasqlpython.ru есть другие задания в категории «data_engineering», продуктовые кейсы, справочник метрик, AI мок-собеседование с разбором ваших ответов.
← Все задания