схемы

схемы


== Таблички со схемами меньше весят ==


Представьте, что вы храните дату какого-нибудь события. Вы называете это, например, activation_date и используете какие-нибудь map-reduce инструменты для генерации табличек. Вы заходите в браузере в yt и видите классно-оформленную табличку со значениями вида "2017-08-10 10:23:09", "2017-08-11 16:22:32", и т.д. 


Кажется, что всё ок. На самом деле это ужас с точки зрения хранения.


1) Если yt не сказать заранее, какой тип будет у колонки, он будет использовать тип any. Это означает, что там будет храниться yson (яндексовский аналог json) - это такой контейнер данных, который может хранить что угодно. Словари, числа, массивы, и как в нашем случае - строку. Много ли она весит в таком контейнере?


>>> import yt

>>> yt.yson.dumps("2017-08-11 16:22:32").__sizeof__()

58


58 байт. Почти столько же, сколько и обычная строка


>>> "2017-08-11 16:22:32".__sizeof__()

56


Ок, а что насчет других типов? 


>>> yt.yson.dumps(True).__sizeof__()

42


Вот это уже очень плохо. Тип boolean можно было бы хранить в одном бите, но если его хранить в yson, то он будет весить 42 байта, то есть в 336 раз больше. 


Зачем же вообще тогда нужен yson? Для удобства использования map-reduce инструментов. Чтобы можно было всё записывать в один контейнер не думая о том, что же там внутри. А разве нельзя каждый тип хранить в своем контейнере, и автоматически складывать что куда нужно? - На этот вопрос долго можно отвечать, но быстрый ответ: нет.


Ок. Давайте еще раз посмотрим на строчки "2017-08-10 10:23:09", "2017-08-11 16:22:32" . Действительно ли это самый оптимальный способ хранения? Может есть еще лучше? - Да. Используем timestamp - 1521819175 . Это число влезает в 8 байт (стандартный контейнер для yt, обозначаемый как uint64 , или int64). И эта штука весит меньше чем "2017-08-11 16:22:32" (56 байт) в 7 раз! 


Таблички, которые меньше весят, быстрее скачиваются, над ними быстрее производятся map-reduce операции. Представьте, что было бы, если ваш nirvana-граф выполнялся бы не 12 часов, а 2 часа?


== В табличках со схемами меньше ошибок ==


Я очень часто вижу в чатике поддержки yql вопросы вида "Expected char: "\2", but read: "\6"" . Такие и подобные вопросы возникают, когда yql думает , что в табличке записан int, а там записан string. 


Если вы уверены, что у колонки должен быть тип int

Report Page