Датаклассы
Внимание
Датаклассы поддерживаются только в Python 3.
Основной способ представления строк таблицы — это классы с полями, которые размечены типами (аналог dataclasses). См. также пример.
Мотивация
- Удобство: так как система скалярных типов YTsaurus более богатая, чем в Python, разметка типами помогает явно выразить желаемые типы колонок. Ещё лучше видно удобство при работе со сложными типами, например, структурами.
- Строгая типизация позволяет распознавать ошибки в коде до того, как они приведут к появлению некорректных данных и другим неприятным эффектам. В этом также могут помогать линтеры и IDE.
- Скорость: за счёт использования формата Skiff и некоторых других оптимизаций потребление CPU в несколько раз меньше, чем для нетипизированных данных.
Установка
Для работы с модулем yt.wrapper.schema
установите пакеты:
typing_extensions
ytsaurus-yson
six
Введение
Для работы с табличными данными нужно объявить класс с декоратором yt.wrapper.yt_dataclass
и разметить его поля типами. После двоеточия указывается тип поля. Это могут быть:
- встроенные типы в Python:
int
,float
,str
и другие; - пользовательские классы с декоратором
@yt_dataclass
; - композитные типы из модуля typing. Сейчас поддерживаются
List
,Dict
,Optional
,Tuple
. В планах поддержка ряда других типов. - специальные типы из
yt.wrapper.schema
:Int8
,Uint16
,OtherColumns
и другие (более полный список ниже).
Пример:
@yt.wrapper.yt_dataclass
class Row:
id: int
name: str
is_robot: bool = False
Для описанного таким образом класса будут сгенерированы конструктор и прочие служебные методы, в частности, __eq__
и __repr__
. Для некоторых полей можно указать значение по умолчанию. Оно попадёт в сигнатуру конструктора. Объект данного класса можно создавать обычным образом: row = Row(id=123, name="foo")
. При этом для всех полей, для которых не указаны значения по умолчанию (как для robot: bool = False
), необходимо передать соответствующие поля в конструктор, иначе будет порождено исключение.
Для датаклассов поддерживается наследование.
Имея такой класс, можно:
- Создать таблицу с соответствующей схемой (можно просто начать писать в пустую или несуществующую таблицу или использовать функцию
TableSchema.from_row_type()
). - Писать и читать таблицы, пример.
- Запускать операции, пример.
Специальные типы
yt.wrapper.schema |
Python | Схема |
---|---|---|
Int8, Int16 , Int32 , Int64 |
int |
int8 , int16 , int32 , int64 |
Uint8 , Uint16 , Uint32 , Uint64 |
int |
uint8 , uint16 , uint32 , uint64 |
YsonBytes |
bytes |
yson /any |
OtherColumns |
OtherColumns |
Соответствует нескольким колонкам. |