docs(accuracy): профильная документация выверена по коду

- Зачем:
  - профильные доки отстали от реализации: схема ods.*_errors, DQ-split и
    сборка dds.event описывались неверно, ряд артефактов и параметров отсутствовал.
    Канон по этим темам де-факто задают свежие уроки 2–3 курса.
- Что:
  - ARCHITECTURE: ods.*_errors как копия с Kafka-метаданными+raw+error_reason;
    DQ-split подан как пересекающийся; dds.event — browser-driven LEFT JOIN с
    маркером location_not_found; добавлен перечень DQ-маркеров; уточнены
    dq_summary (слой dm, orphan_events) и v_session_overview.
  - REPO_MAP: добавлен sql/ods/20_stg_to_ods.sql, утилиты DAG, скрипты Superset;
    scripts/make помечены как запасной путь, Airflow — основной.
  - OPERATIONS: параметр wait_stg_timeout_sec; порт Superset и креды ClickHouse.
  - SUPERSET_DASHBOARD: исправлен пароль ClickHouse (123456); убран сломанный
    make superset-export, удалён superset/export_dashboard.py и target в Makefile.
- Проверка:
  - git diff проверен против sql/*, airflow/dags/*, configs/default_user.xml;
    ER-диаграмма провалидирована mermaid-валидатором.
This commit is contained in:
2026-06-06 21:43:31 +03:00
parent 90f3ac5ea1
commit 92e9c4b45a
7 changed files with 106 additions and 161 deletions
-107
View File
@@ -1,107 +0,0 @@
#!/usr/bin/env python3
"""
================================================================================
Экспорт дашборда Superset в JSON-формат
================================================================================
Назначение:
- Экспорт созданного дашборда в JSON для версионирования
- Формат совместимый с superset import-dashboards
Запуск:
docker compose exec superset python /app/superset_init/export_dashboard.py
================================================================================
"""
import json
import sys
import os
sys.path.insert(0, '/app')
try:
from superset.app import create_app
from superset.dashboards.data_access_layer import DashboardDAO
from superset.charts.data_access_layer import ChartDAO
except ImportError as e:
print(f"Error importing: {e}")
sys.exit(1)
def export_dashboard(slug: str, output_path: str):
"""Экспорт дашборда в JSON"""
app = create_app()
with app.app_context():
dashboard = DashboardDAO.get_by_slug(slug)
if not dashboard:
print(f"Dashboard with slug '{slug}' not found")
return False
# Собираем данные дашборда
dashboard_data = {
"dashboards": [
{
"__Dashboard__": {
"dashboard_title": dashboard.dashboard_title,
"description": dashboard.description,
"slug": dashboard.slug,
"json_metadata": dashboard.json_metadata,
"position_json": dashboard.position_json,
"published": dashboard.published,
"slices": []
}
}
],
"charts": [],
"datasets": []
}
# Добавляем чарты
for slice_obj in dashboard.slices:
chart_data = {
"__Slice__": {
"slice_name": slice_obj.slice_name,
"viz_type": slice_obj.viz_type,
"params": slice_obj.params,
"description": slice_obj.description,
"datasource_type": slice_obj.datasource_type,
"datasource_name": slice_obj.datasource.name if slice_obj.datasource else None
}
}
dashboard_data["dashboards"][0]["__Dashboard__"]["slices"].append(slice_obj.id)
dashboard_data["charts"].append(chart_data)
# Добавляем датасет
if slice_obj.datasource:
ds = slice_obj.datasource
dataset_data = {
"__SqlaTable__": {
"table_name": ds.table_name,
"schema": ds.schema,
"database": ds.database.database_name if ds.database else None,
"description": ds.description,
"columns": [
{
"column_name": col.column_name,
"type": col.type,
"description": col.description
}
for col in ds.columns
]
}
}
# Добавляем уникальные датасеты
if dataset_data not in dashboard_data["datasets"]:
dashboard_data["datasets"].append(dataset_data)
# Сохраняем в файл
with open(output_path, 'w', encoding='utf-8') as f:
json.dump(dashboard_data, f, indent=2, ensure_ascii=False)
print(f"Dashboard exported to: {output_path}")
return True
if __name__ == "__main__":
output_file = "/app/superset_init/dashboards/ecommerce_analytics.json"
export_dashboard("ecommerce-analytics", output_file)