{"id":27165941,"url":"https://github.com/viktorsvertoka/goit-de-fp","last_synced_at":"2026-02-21T11:01:02.312Z","repository":{"id":161470477,"uuid":"616671364","full_name":"ViktorSvertoka/goit-de-fp","owner":"ViktorSvertoka","description":"Home task for Data Engineering course💻","archived":false,"fork":false,"pushed_at":"2024-12-07T16:15:24.000Z","size":7031,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-28T00:55:01.202Z","etag":null,"topics":["apache-airflow","apache-kafka","apache-spark","docker","goit","goit-de-fp","pipeline","python"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ViktorSvertoka.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2023-03-20T21:06:07.000Z","updated_at":"2024-12-07T16:15:27.000Z","dependencies_parsed_at":"2024-11-12T16:39:24.780Z","dependency_job_id":"e964de93-0de0-4cd2-8223-3099d8ab6073","html_url":"https://github.com/ViktorSvertoka/goit-de-fp","commit_stats":null,"previous_names":["viktorsvertoka/goit-de-fp"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/ViktorSvertoka/goit-de-fp","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ViktorSvertoka%2Fgoit-de-fp","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ViktorSvertoka%2Fgoit-de-fp/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ViktorSvertoka%2Fgoit-de-fp/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ViktorSvertoka%2Fgoit-de-fp/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ViktorSvertoka","download_url":"https://codeload.github.com/ViktorSvertoka/goit-de-fp/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ViktorSvertoka%2Fgoit-de-fp/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29679049,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-21T09:33:50.764Z","status":"ssl_error","status_checked_at":"2026-02-21T09:33:19.949Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["apache-airflow","apache-kafka","apache-spark","docker","goit","goit-de-fp","pipeline","python"],"created_at":"2025-04-09T03:37:14.014Z","updated_at":"2026-02-21T11:01:02.240Z","avatar_url":"https://github.com/ViktorSvertoka.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Фінальний проєкт з курсу\n\n# Частина 1. Building an End-to-End Streaming Pipeline\n\n## Покрокова інструкція виконання\n\n\u003e [!NOTE]\n\u003e\n\u003e 👉🏻 Отже, ви вже знаєте умови завдання. Висвітлимо їх докладніше.\n\nВи працюєте в букмекерській конторі. Одне з ваших завдань — генерація даних для\nML-моделей. Деякі з features — це середній зріст, середня вага, стать, країна\nпоходження атлетів.\n\nМоделі тренуються окремо для кожного виду спорту. Дані про наявність медалі у\nвиступі використовуються як target (output) для ML-моделі.\n\nФірма хоче коригувати коефіцієнти ставок якомога швидше, тому вас попросили\nрозробити відповідне рішення з використанням стримінгу. Фізичні дані атлетів\nвідомі заздалегідь і зберігаються в MySQL базі даних. Результати змагань же\nподаються через Kafka-топік.\n\nВаша задача:\n\n1. Зчитати дані фізичних показників атлетів за допомогою Spark з MySQL таблиці\n   `olympic_dataset.athlete_bio` (база даних і Credentials до неї вам будуть\n   надані).\n\n2. Відфільтрувати дані, де показники зросту та ваги є порожніми або не є\n   числами. Можна це зробити на будь-якому етапі вашої програми.\n\n3. Зчитати дані з результатами змагань з Kafka-топіку `athlete_event_results`.\n   Дані з json-формату необхідно перевести в dataframe-формат, де кожне поле\n   json є окремою колонкою.\n\n4. Об’єднати дані з результатами змагань з Kafka-топіку з біологічними даними з\n   MySQL таблиці за допомогою ключа `athlete_id`.\n\n5. Знайти середній зріст і вагу атлетів індивідуально для кожного виду спорту,\n   типу медалі або її відсутності, статі, країни (`country_noc`). Додайте також\n   timestamp, коли розрахунки були зроблені.\n\n6. Зробіть стрим даних (за допомогою функції `forEachBatch`) у:\n\nа) вихідний кафка-топік,\n\nb) базу даних.\n\nВигляд вихідних даних має бути приблизно таким:\n\n![Results](./assets/pic-01.png)\n\n## Критерії прийняття та оцінювання\n\n- Код виконується та надає бажаний результат.\n- Наведено скриншоти, що демонструють результат роботи коду методом виведення на\n  екран чи/та в базу даних.\n\n\u003e [!IMPORTANT]\n\u003e\n\u003e За умови виконання всіх завдань достатньо скриншотів тільки бази даних та\n\u003e принта даних з Kafka-топіку (не потрібні скриншоти проміжних етапів).\n\nУ коді коментарями позначено, де саме відбувається виконання кожного етапу\nзавдання. Наприклад, `# Етап 6.а): запис у вихідний Kafka-топік`.\n\n\u003e [!TIP]\n\u003e\n\u003e ☝🏻 Критерії прийняття фінального проєкту є обов’язковою умовою його оцінювання\n\u003e ментором. Якщо якийсь із критеріїв не виконано, ментор відправить завдання на\n\u003e доопрацювання без оцінювання. Якщо вам «тільки уточнити»😉 або ви\n\u003e застопорилися на якомусь з етапів виконання — звертайтеся до ментора у Slack).\n\n#### Загальна максимальна кількість балів — 50:\n\n- Етап 1 оцінюється в 10 балів.\n- Етап 2 оцінюється у 5 балів.\n- Етап 3 оцінюється в 10 балів.\n- Етап 4 оцінюється у 5 балів.\n- Етап 5 оцінюється у 5 балів.\n- Етап 6 оцінюється у 15 балів (7 за стрим у вихідний Kafka-топік і 8 у базу\n  даних).\n\n\u003e [!CAUTION]\n\u003e\n\u003e Якщо є помилки чи недоліки виконання, кількість балів на кожному етапі\n\u003e зменшується пропорційно до наявних помилок на розсуд ментора.\n\n# Частина 2. Building an End-to-End Batch Data Lake\n\n## Покрокова інструкція виконання\n\n\u003e [!NOTE]\n\u003e\n\u003e 👉🏻 Нагадаємо суть завдання\n\nУ цій частині проєкту ви створите простий multi-hop datalake, який\nвикористовуватиме інструменти обробки даних, такі як Spark, для роботи з даними\nта організації ETL-процесів (Extract, Transform, Load).\n\nЗадача буде схожа до тої, яку ви розв’язували в першому фінальному проєкті, але\nцього разу ви будете працювати з батчами даних, що є критично важливим для\nбудь-якої Data Engineering системи.\n\nУ ході виконання завдання ви будете працювати з уже відомими вам даними про\nатлетів та їхні спортивні результати. Це таблиці `athlete_bio` та\nathlete_event_results, які знаходяться на FTP-сервері за адресами\nhttps://ftp.goit.study/neoversity/athlete_bio.txt і\nhttps://ftp.goit.study/neoversity/athlete_event_results.txt відповідно.\n\nОсновне завдання полягає в побудові трирівневої архітектури обробки даних: від\nпочаткового збереження (landing zone), через оброблені та очищені дані\n(bronze/silver), до фінального аналітичного набору (gold).\n\nВаша задача:\n\n1. Написати файл `landing_to_bronze.py`. Він має:\n\n- завантажувати файл з ftp-сервера в оригінальному форматі csv,\n- за допомогою Spark прочитати csv-файл і зберегти його у форматі parquet у\n  папку `bronze/{table}`, де `{table}` — ім’я таблиці.\n\n2. Написати файл `bronze_to_silver.py`. Він має:\n\n- зчитувати таблицю bronze,\n- виконувати функцію чистки тексту для всіх текстових колонок,\n- робити дедублікацію рядків,\n- записувати таблицю в папку `silver/{table}`, де `{table}` — ім’я таблиці.\n\n3. Написати файл `silver_to_gold.py`. Він має:\n\n- зчитувати дві таблиці: `silver/athlete_bio` та `silver/athlete_event_results`,\n- робити join за колонкою `athlete_id`,\n- для кожного значення `sport`, `medal`, `sex`, `country_noc` знаходити середні\n  значення `weight і height`,\n- додати колонку `timestamp` з часовою міткою виконання програми, записувати\n  дані в `gold/avg_stats`.\n\n4. Написати файл `project_solution.py`, де буде знаходитись Airflow DAG, який\n   послідовно запускатиме всі три файли.\n\n## Критерії прийняття та оцінювання\n\n- Код виконується та надає бажаний результат.\n- Наведено скриншоти, що демонструють результат роботи коду (скриншоти таблиць\n  виведення та скриншот графу відпрацьованого DAGу).\n\n\u003e [!TIP]\n\u003e\n\u003e ☝🏻 Критерії прийняття фінального проєкту є обов’язковою умовою його оцінювання\n\u003e ментором. Якщо якийсь із критеріїв не виконано, ментор відправить завдання на\n\u003e доопрацювання без оцінювання. Якщо вам «тільки уточнити»😉 або ви\n\u003e застопорилися на якомусь з етапів виконання — звертайтеся до ментора у Slack).\n\n#### Загальна максимальна кількість балів — 50:\n\n- Етап 1 оцінюється у 15 балів.\n- Етап 2 оцінюється у 15 балів.\n- Етап 3 оцінюється в 10 балів.\n- Етап 4 оцінюється в 10 балів. Якщо є помилки чи недоліки виконання, кількість\n  балів на кожному етапі зменшується пропорційно до наявних помилок на розсуд\n  ментора.\n\n## Підготовка й завантаження фінального проєкту\n\n1. Створіть публічний репозиторій goit-de-fp.\n\n2. Виконайте обидві частини проєкту та відправте у свій репозиторій файли з\n   кодом та скриншоти результатів роботи у текстовому файлі.\n\n\u003e [!IMPORTANT]\n\u003e\n\u003e 💡 Для частини 1 фінального проєкту:\n\u003e\n\u003e За умови виконання всіх завдань достатньо скриншотів тільки бази даних і\n\u003e принта даних з Kafka-топіку (не потрібні скриншоти проміжних етапів).\n\n\u003e [!WARNING]\n\u003e\n\u003e 💡 Для частини 2 фінального проєкту:\n\nФінальний DataFrame для кожної Spark job виведіть на екран командою `df.show()`,\nде `df` — це ваш DataFrame. Результат з’явиться в логах відповідних run і\ntaks-run.\n\nДля того, щоб до них дістатися, клікніть на значок відповідного taks-run (зліва\nвиділено червоним) і на Logs (справа виділено червоним).\n\n![Results](./assets/pic-02.png)\n\nПрогорніть до того моменту, коли знайдете виведення на екран датафрейму. Зробіть\nскриншот приблизно так, як показано на цьому малюнку. Має також бути видно\nчасову мітку (стовпчик зліва в синьому прямокутнику).\n\nДостатньо зробити скриншот виведення для однієї будь-якої таблиці для кожної\nSpark job. Відповідно маєте отримати три такі скриншоти.\n\nТакож зробіть скриншот графу відпрацьованого DAGу.\n\n![Results](./assets/pic-03.png)\n\n3. Створіть один архів, що містить усі файли з кодом виконання завдання, та\n   текстовий документ із скриншотами, прикріпіть його в LMS. Назва архіву\n   повинна бути у форматі ФП_ПІБ.\n\n4. Прикріпіть посилання на репозиторій `goit-de-fp` і відправте на перевірку.\n\n## Формат здачі\n\n- Посилання на репозиторій `goit-de-fp`.\n- Прикріплений архів із назвою ФП_ПІБ.\n\n## Фінальний проєкт з курсу Data Engineering\n\n### Результати виконаного завдання № 1\n\n#### Запис даних у таблицю MySQL\n\n![Results](./print_screens/print_screen_01.png)\n\n#### Запис даних у Kafka-топік\n\n![Results](./print_screens/print_screen_02.png)\n\n### Результати виконаного завдання № 2\n\n#### Запис даних у таблицю bronze\n\n![Results](./print_screens/print_screen_03.jpeg)\n\n#### Запис даних у таблицю silver\n\n![Results](./print_screens/print_screen_04.jpeg)\n\n#### Запис даних у таблицю gold\n\n![Results](./print_screens/print_screen_05.jpeg)\n\n#### DAG з усіма відпрацьованими завданнями\n\n![Results](./print_screens/print_screen_06.jpeg)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fviktorsvertoka%2Fgoit-de-fp","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fviktorsvertoka%2Fgoit-de-fp","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fviktorsvertoka%2Fgoit-de-fp/lists"}