Качество тестовых данных

A presentation at RNDTech 2021 in September 2021 in Rostov-on-Don, Rostov Oblast, Russia by Vsevolod Brekelov

Slide 1

Slide 1

Качество тестовых данных #synthesized #data #data-quality #tools #sql #greatexpectations Vsevolod Brekelov 04.09.2021 #rndtechconf 1

Slide 2

Slide 2

Познакомимся 🙂 2

Slide 3

Slide 3

Привет, я Сева! 👋 Engineering Lead @Synthesized @volekerb @brekelov 3

Slide 4

Slide 4

Привет, я Сева! 👋 Тестирование - Разработка - Менеджмент > 10 лет Курс по прикладному тестированию в ИТМО https: github.com/volekerb/testing-lectures Канал с инженерными статьями, книгами, видео https: t.me/engineerreadings @volekerb Конференции Heisenbug, JPoint, Joker / / / / 4 @brekelov

Slide 5

Slide 5

https: www.youtube.com/playlist?list=PLwvQQeADNQWcA0NdtL6_AEXl58Gf7ERuw / / 5

Slide 6

Slide 6

3 вопроса 6

Slide 7

Slide 7

Для кого? 7

Slide 8

Slide 8

О чем? 8

Slide 9

Slide 9

Зачем? 9

Slide 10

Slide 10

Почему Data Quality кого-то волнует? И что это? 10

Slide 11

Slide 11

🧑🔬 🤓 👩💻 Инженер данных Исследователь данных Аналитик данных Запросы 👩 👨🦱 👱 Бизнес-пользователи Запросы

  • Большие наборы данных - Бизнес правила
  • Вопросы - Обновления 11

Slide 12

Slide 12

Companies lose an average of $15M per year due to bad data https: / / 12 hbr.org/2020/02/data-driven-decisions-start-with-these-4-que

Slide 13

Slide 13

“With the goal of building and achieving data quality standards across Uber, we have supported over 2,000 critical datasets on this platform, and detected around 90% of data quality incidents.” https: eng.uber.com/operational-excellence-data-quality/ / / 13

Slide 14

Slide 14

https: eng.uber.com/operational-excellence-data-quality/ / / 14

Slide 15

Slide 15

“For data consumption, we heard complaints from decision makers that different teams reported different numbers for very simple business questions, and there was no easy way to know which number was correct.” https: medium.com/airbnb-engineering/how-airbnb-achieved-metric-consistency-at-scale-f23cc53dea70 / / 15

Slide 16

Slide 16

16

Slide 17

Slide 17

Data Quality Что это? • Accuracy: Is the data correct? • Consistency: Is everybody looking at the same data? • Usability: Is data easy to access? • Timeliness: Is data refreshed on time, and on the right cadence? • Cost Efficiency: Are we spending on data efficiently? • Availability: Do we have all the data we need? 17

Slide 18

Slide 18

• Accuracy: Is the data correct? “Корректность” может быть у каждого разной 18

Slide 19

Slide 19

• Consistency: Is everybody looking at the same data? Скорее речь о том, насколько данные консистенты с теми, что были в моменте “до” или в прошлом 19

Slide 20

Slide 20

• Usability: Is data easy to access? Хорошо. Но с качеством данных не очень поможет =) 20

Slide 21

Slide 21

• Timeliness: Is data refreshed on time, and on the right cadence? Звучит очень хорошо! 21

Slide 22

Slide 22

• Cost Efficiency: Are we spending on data efficiently? Можно годами обсуждать с финансовыми отделами 22

Slide 23

Slide 23

• Availability: Do we have all the data we need? Это скорее про то, что доступны ли данные нам 23

Slide 24

Slide 24

#DataOps or #DataObservability Метрики Built-in data observability Алерты Automatic Data Testing 24 Data Quality Process Automation

Slide 25

Slide 25

Решения в больших компаниях | Amundsen (Lyft) Hive, Redshift, Druit, RDBMS, Presto, | Datahub (LinkedIn) Hive, Kafka, RDBMS | Metacat (Netflix) Hive, RDS, Teradata, Redshift, S3, Ca | Atlas (Apache) HBase, Hive, Sqoop, Kafka, Storm | Marquez (Wework) S3, Kafka | Databook (Uber) Hive, Vertica, MySQL, Postgress, Cass | Dataportal (Airbnb) Unknown | Data Access Layer (Twitter) HDFS, Vertica, MySQL | Lexikon (Spotify) Unknown 25

Slide 26

Slide 26

А что если нам это все сразу не надо? 26

Slide 27

Slide 27

По-порядку! • Приватность • Битые данные • Недостаточные данные • Тестирование данных (Может есть что-то типа JUnit?) 27

Slide 28

Slide 28

По-порядку! • Приватность • Битые данные • Недостаточные данные • Тестирование данных (Может есть что-то типа JUnit?) 28

Slide 29

Slide 29

Продакшн данные 🧑🔬 Мне нужны реальные данные, тк я тут такую машин лернинг модель сделал УУУХХ! 👩💻 Мне нужны исторические данные, хочу угадать, когда надо предлагать кредит! 🤓 Мне нужно протестировать систему и точно понять, что все кейсы ок проходят! 29

Slide 30

Slide 30

Продакшн данные 🧑🔬 Это все хорошо Мне нужны реальные данные, тк я тут такую машин лернинг модель сделал УУУХХ! 👩💻 Мне нужны исторические данные, хочу угадать, когда надо предлагать кредит! 🤓 Мне нужно протестировать систему и точно понять, что все кейсы ок проходят!

Slide 31

Slide 31

Slide 32

Slide 32

Данные, но уже не оч похожие на продакшн Моя машин лернинг модель чет плохо работает =( А можно заново сделать, у нас там схема поменялась? 32

Slide 33

Slide 33

Синтетические данные 33

Slide 34

Slide 34

Синтезируем Продакшн данные 34 Данные ведут себя как продакшн данные

Slide 35

Slide 35

Данные ведут себя как продакшн данные 🧑🔬 О! Все заработало! 👩💻 Во! Теперь можно хорошо угадать! 🤓 Все быстро сгенерилось и могу сам обновить данные! 35

Slide 36

Slide 36

🥷 Теперь не найти реальные телефоны и адреса и номера кредиток. Как же я вам дозвонюсь? 36

Slide 37

Slide 37

По-порядку! • Приватность • Битые данные • Недостаточные данные • Тестирование данных (Может есть что-то типа JUnit?) 37

Slide 38

Slide 38

По-порядку! • Приватность • Битые данные • Недостаточные данные • Тестирование данных (Может есть что-то типа JUnit?) 38

Slide 39

Slide 39

Когда нужно генерировать данные? • Юнит/компонентные/интеграционные тесты • Интеграционные/Системные тесты с production-like системой • Переехали на новый стек технологий (не было тестов, требований. Все как обычно) • Только стартуем проект и нет продакшна 39

Slide 40

Slide 40

https: github.com/topics/data-generation / / 40

Slide 41

Slide 41

Юнит тесты @Test void givenDefaultConfiguration_thenGenerateSingleObject() { EasyRandom generator = new EasyRandom(); Person person = generator.nextObject(Person.class); assertNotNull(person.getAge()); assertNotNull(person.getFirstName()); assertNotNull(person.getLastName()); } Person[firstName=’eOMtThyhVNLWUZNRcBaQKxI’, lastName=’yedUsFwdkelQbxeTeQOvaScfqIOOmaa’, age=-1188957731] 41

Slide 42

Slide 42

Системные / Интеграционные тесты Script1.sql Script2.sql … ScriptN.sql 42

Slide 43

Slide 43

🤓 Написать Script1.sql Накатить Script2.sql Поддерживать … ScriptN.sql Угадать все сценарии =) 43

Slide 44

Slide 44

44

Slide 45

Slide 45

По-порядку! • Приватность • Битые данные • Недостаточные данные • Тестирование данных (Может есть что-то типа JUnit?) 45

Slide 46

Slide 46

AWS Deequ

Slide 47

Slide 47

val veri cationResult = Veri cationSuite() .onData(data) .addCheck(Check(CheckLevel.Error, “unit testing my data”) .hasSize(_ == 5) // we expect 5 rows .isComplete(“id”) // should never be NULL .isUnique(“id”) // should not contain duplicates .isComplete(“productName”) // should never be NULL .isContainedIn(“priority”, Array(“high”, “low”)) .isNonNegative(“numViews”) // should not contain negative values .containsURL(“description”, _ >= 0.5) .hasApproxQuantile(“numViews”, 0.5, _ <= 10)) .run() Persistence and querying of computed metrics of the data with a MetricsRepository Data profiling of large data sets Anomaly detection on data quality metrics over time Automatic suggestion of constraints for large datasets Incremental metrics computation on growing data and metric updates on partitioned data (advanced) fi 47 fi • • • • •

Slide 48

Slide 48

Apache griffin / / 48 https: griffin.apache.org/

Slide 49

Slide 49

Great Expectations • expect_column_values_to_not_be_null • expect_column_values_to_match_regex • expect_column_values_to_be_unique • expect_column_values_to_match_strftime_format • expect_table_row_count_to_be_between • expect_column_median_to_be_between https: / / 49 github.com/great-expectations/great_expectations

Slide 50

Slide 50

Бонус 50

Slide 51

Slide 51

SQL анализ 51

Slide 52

Slide 52

52

Slide 53

Slide 53

Датасет / Данные найти и догенерить недостающие 53

Slide 54

Slide 54

https: holistic.dev/playground/f9a504e1-6bd4-4464-a951-87b3b9db6e69 https: dwh.dev/report/summary / / / / 54

Slide 55

Slide 55

Надеюсь, достаточно пищи для ума 55

Slide 56

Slide 56

Приходите к нам работать! 😉 https: www.synthesized.io/open-positions/kotlin-engineer / / 56

Slide 57

Slide 57

Спасибо! 👋 @volekerb @brekelov 57

Slide 58

Slide 58

На почитать • https://www.vldb.org/pvldb/vol11/p1781-schelter.pdf • http://giis.uniovi.es/testing/papers/stvr-2010-sqlfpc.pdf • http://giis.uniovi.es/testing/#stvr10sqlfpc • https://francois-nguyen.blog/2021/03/07/towards-a-data-mesh-part-1-data-domains-andteams-topologies/ • http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.216.1676&rep=rep1&type=pdf • https://databricks.com/blog/2020/03/04/how-to-monitor-data-stream-quality-using-sparkstreaming-and-delta-lake.html • 58