BI Consult Desktop Logo BI Consult Mobile Logo
  • Russian BI Исследование российских bi
  • Перейти на Fine BI
  • Контакты
  • +7 812 334-08-01
    +7 499 608-13-06
  • Отправить сообщение
  • Главная
  • Продукты Эксперт-BI
    • Дистрибуция
    • Розничная торговля
    • Производство
    • Операторы связи
    • Страхование
    • Банки
    • Лизинг
    • Логистика
    • Нефтегазовый сектор
    • Медицина
    • Сеть ресторанов
    • E-Commerce
    • Сельское хозяйство
    • Энергетика
    • FMCG
    • Девелоперы
    • Маркетплейсы
    • Пищевая промышленность
    • Фармацевтика
    • Построение Data Platform
    • Цифровая трансформация
    • Управление по KPI
    • Финансы
    • Продажи
    • Склад
    • HR
    • Маркетинг
    • Внутренний аудит
    • Категорийный менеджмент
    • S&OP и FP&A
    • Геоаналитика
    • Цепочки поставок (SCM)
    • AutoML
    • Process Mining
    • IBP
    • ИТ (CIO)
    • Закупки
  • Платформы
    • Системы бизнес-анализа (BI)
    • Интегрированное бизнес-планирование (IBP)
    • Хранилища данных (DWH / Lakehouse)
    • Каталоги данных (Data Catalog)
    • Системы ETL и ELT
    • AI / Исскуственный интеллект
    • Шина данных (ESB)
    • Система управления мастер-данными (MDM)
    • Семантический слой
  • Услуги
    • Переход на отечественные BI и DWH системы
    • Консалтинг
    • Пилотный проект
    • Обучение и сертификация
    • Бесплатное обучение
    • Поддержка
    • Технические задания
    • Сбор требований для проекта внедрения BI-системы
    • CI/CD для DWH
    • Аудит BI приложений и DWH
    • Выделенная команда
    • Настойка и поддержка баз данных
    • Разработка BI Стратегии
    • Styleguide для BI-системы
    • Как выбрать BI-систему
  • Курсы
    • Учебный курс Информационная грамотность (Data Literacy)
    • Учебный курс для бизнес-аналитиков
    • Учебный курс для системных аналитиков
    • Учебный курс по Data Governance
    • Учебный курс Как стать CDO
    • Учебный курс Современная архитектура хранилища данных
    • Учебный курс по Fine BI
    • Учебный курс по FineReport
    • Учебный курс по DWH
    • Учебный курс по Data Science (ML, AI)
    • Учебный курс по PostgreSQL
    • Учебный курс по Greenplum
    • Учебный курс по Apache Airflow и NiFi
    • Учебный курс по Open-source BI
    • Учебный курс по ClickHouse
    • Учебный курс по DataLens
    • Учебный курс по Loginom
    • Учебный курс по Modus BI и ETL
    • Учебный курс по Visiology
    • Учебный курс по dbt (Data Build Tool)
  • Компания
    • Руководство
    • Новости
    • Клиенты
    • Карьера
    • Скачать
    • Контакты

BI

  • FineBI
  • FineReport
  • FineDataLink
  • FineChatBI (FineAI)
  • Коннекторы данных из 1С в BI
  • Airflow / Nifi
  • Visiology
  • PIX BI
  • Modus BI
  • Yandex.DataLens
  • Open-source BI: Superset/Metabase
  • Luxms BI
  • AW BI + Alpha BI
  • FlyBI + Форсайт. Аналитическая Платформа
  • Loginom
  • Триафлай
  • AI / Исскуственный интеллект
  • Optimacros
  • Навигатор BI
  • Семантический слой

СУБД

  • Arenadata
  • ClickHouse
  • Greenplum
  • Postgres Professional
  • TData

Другое

  • Построение Data Platform
    • Аналитическое хранилище данных
    • Data Lake и Data Engineering
    • Подробнее про Data Lake
    • Внедрение Lakehouse
      • Apache Doris
      • StarRocks
      • Trino
    • Миграция витрин из пропиетарных DWH на новый стек
    • Учебный курс "Современная архитектура хранилища данных"
Главная » Курсы по системам бизнес-анализа и методологии » Учебный курс Современная архитектура хранилища данных » Энциклопедия Trino » array trino

array trino

 

Краткое введение

Работа с массивами представляет особую модель данных в современных аналитических системах. В аналитике часто встречаются многозначные признаки пользователей, списки товаров в заказах, теги событий и другие поля, которые естественнее хранить как массивы. В контексте Trino работа с типом ARRAY открывает широкие возможности для агрегаций, фильтрации и преобразований без дублирования данных. Эта глава посвящена тем, как эффективно проектировать, реализовывать и поддерживать запросы, работающие с массивами, какие архитектурные и организационные решения лежат в основе таких сценариев, и какие риски следует учитывать при эксплуатации массивных структур в больших данных.

Введение
Типы сложной структуры, такие как массивы и карты, позволяют хранить вложенные данные в один столбец, но при этом добавляют сложности в планировании выполнения, расчетах и нагрузке на сеть и память. В Trino массивы реализуются как элементарный тип данных, поддерживающий множество функций и операторы, включая создание, фильтрацию, агрегацию и разворачивание (UNNEST). Эффективное использование массивов требует баланса между удобством моделирования данных и стоимостью исполнения: чрезмерное использование вложенных типов без учета cardinality может существенно замедлять запросы, особенно при операциях распаковки и соединении с табличными источниками.

Данная глава охватывает теоретические основы массивов в Trino, методологии моделирования данных, архитектурные решения для эффективной поддержки массивов на уровне движка и коннекторов, практические примеры с open-source и российскими решениями, а также риски и рекомендации по устойчивой работе.

 

Теоретические основы и терминология

  • ARRAY как базовый тип: массив элементов одного типа, например ARRAY, ARRAY, ARRAY<STRUCT<...>> и т. д.
  • Элементы массива: элементы индексируются с BASE 1 в большинстве функций Trino (element_at, slice и т. д.).
  • Вложенность: массивы могут быть элементами других структур (например, ARRAY или ARRAY<ARRAY<...>>).
  • Функциональные операции: transform, filter, reduce и другие функции высшего порядка позволяют трансформировать элементы массива без явной распаковки в реляционную форму.
  • UNNEST: оператор для разворачивания массива в табличное представление, что позволяет выполнять агрегации и соединения на уровне элементов массива.
  • Кардинальность: размер массива определяется количеством элементов; большая кардинальность может приводить к экспоненциальному росту объема промежуточных данных.
  • Хранение и компрессия: массивы сохраняются в формате, поддерживающем вложенные типы (Parquet, ORC и т. д.); эффективная сериализация зависит от схемы и коннектора.
  • Поддержка коннекторов: не все коннекторы одинаково хорошо поддерживают полную функциональность массивов или строгую распаковку; важно проверить возможности Pushdown и оптимизации на уровне конкретного коннектора.

     

Методологии и подходы

  • Нормализация против денормализации: хранение как массивы полезно, когда признаки действительно являются множеством значений. Однако для некоторых сценариев имеет смысл хранить связанные сущности в отдельных таблицах и использовать JOIN/UNNEST для анализа.
  • Разворачивание vs агрегация: если цель** - анализ по элементам массива, UNNEST часто необходим; однако для агрегирования по массивам можно использовать array_agg и другие функции без распаковки.
  • Выбор функций: для операций над массивами чаще используются:
    • array_agg, для сбора значений в массив после группировки;
    • array_distinct, для удаления повторов;
    • array_join, для конкатенации элементов массива в строку;
    • element_at и index-based доступ;
    • cardinality, для оценки размера;
    • transform, filter и reduce, для функционального преобразования элементов;
    • array_contains и contains, для фильтрации по содержимому.
  • Оптимизация запросов: избегайте нестратегических UNNEST на массивы очень большой размерности; применяйте фильтры до разворачивания (predicate pushdown там, где поддерживается коннектор); используйте лимитирование и параллельность на уровне планировщика.
  • Архитектурные решения: хранение массивов в формате колонки с вложенной структурой обеспечивает эффективное сканирование, если запросы преимущественно используют элементы или их агрегаты; когда же запросы требуют частного доступа к элементам, лучше рассмотреть денормализацию на уровне схемы или применение кэширования/материализованных представлений.
  • Политика схемы и эволюции: изменение типа массива или содержимого элементов должно сопровождаться миграцией данных или backward-compatible стратегиями (например, добавление нового элемента в расширенные структуры без разрушения существующих запросов).

     

Архитектура и технологическая реализация

  • Общее представление: в Trino массивы являются частью типа данных, который хранится в столбцах. Векторизированный движок обрабатывает операции на уровне элементов, а механизм планирования выбирает оптимальные узлы для разворачивания, фильтрации и агрегации.
  • Хранение и форматы: Parquet и ORC поддерживают вложенные типы; при чтении массивов конвертеры и стратификация данных не должны приводить к перепаковке, если коннектор и формат поддерживают вложенные данные.
  • UNNEST и план выполнения: разворачивание массива обычно реализуется через оператор UNNEST, который создаёт временную таблицу из элементов массива и позволяет выполнять последующие операции (JOIN, GROUP BY, фильтры) на уровне элементов.
  • Интеграция с коннекторами:
    • Iceberg/Delta-like слои: поддерживают вложенные типы и позволяют эффективные фильтры, если источники индексируемы и поддерживают predicate pushdown.
    • ClickHouse (российская экосистема): часто применяется как источник или целевой хранилище для аналитических кейсов, где массивы встречаются в столбцах типа Array(T) и обрабатываются через совместимые коннекторы или через промежуточные трансформации.
    • Hadoop/Hive: поддержка вложенных типов через Parquet/ORC; важно проверить совместимость версий и поддержку функций над массивами.
  • Архитектурные решения для эффективной поддержки массивов:
    • Распределение нагрузки: разворачивание больших массивов на множестве узлов может приводить к перегрузке сети; разумно проектировать задачи так, чтобы разворачивать только необходимое число элементов или использовать предварительную агрегацию.
    • Параллелизм: в некоторых сценариях transform/filter на массиве можно распараллелить внутри узла, но это зависит от реализации консолидированного исполнителя и памяти.
    • Мемориальная эффективность: использовать компактные типы элементов, избегать смешения типов внутри массивов, минимизировать дублирование данных при агрегациях.
    • Безопасность и доступ: планируйте доступ к массивам в рамках политики доступа к данным; ограничения по роли и маскировка чувствительных элементов внутри массивов при генерации представлений.

       

Организационные и процессные аспекты

  • Моделирование данных: выбор между хранением массива как единичного поля и созданием маппинговых таблиц для элементов зависит от требований к аналитике и частоты изменений элементов.
  • Эволюция схемы: при добавлении новых элементов в массивы следует учитывать обратную совместимость запросов; стоит внедрять миграции с версионированием схем и тестированием.
  • Обеспечение качества данных: валидируйте элементы массива на этапе загрузки (ETL/ELT), используйте проверки структуры, уникальности и диапазонов значений.
  • Управление доступом: ограничение прав на чтение элементов внутри массивов может потребоваться при работе с персональными данными или секретами; используйте маскирование и контроль доступа на уровне представлений.
  • Документация и обучение: документируйте принципы моделирования массивов, набор функций и типичные паттерны использования, чтобы аналитики могли повторно использовать решения без повторного reinventing the wheel.

Практические примеры и кейсы (open-source и российские решения)

 

Open-source кейсы

  • Пример: обработка заказов с массивами product_ids

    • Схема:
      • CREATE TABLE sales (
        sale_id BIGINT,
        customer_id BIGINT,
        product_ids ARRAY,
        amounts ARRAY
        );
    • Примеры запросов:
      • Выборка с разбивкой по элементам массива:
        
              SELECT sale_id, customer_id, p AS product_id
              FROM sales
              CROSS JOIN UNNEST(product_ids) AS t(p)
              LIMIT 100;
        
  • Агрегация по количеству уникальных продуктов в заказах:

    
          SELECT customer_id, COUNT(DISTINCT p) AS unique_product_count
          FROM sales
          CROSS JOIN UNNEST(product_ids) AS t(p)
          GROUP BY customer_id;
    
  • Фильтрация по наличию конкретного продукта внутри массива:

    
          SELECT *
    ## FROM sales
          WHERE array_contains(product_ids, 12345);
    
  • Агрегация по массивам:

    
          SELECT customer_id, array_agg(sale_id) AS sales
          FROM sales
          GROUP BY customer_id;
    
  • Пример с использованием transform и reduce:

    
    ## SELECT customer_id,
             transform(amounts, x -> x * 0.9) AS discounted_amounts,
             reduce(amounts, 0.0, (s, x) -> s + x) AS total_amount
      FROM sales;
    
  • Пример работы с элементами внутри структур:

    
      SELECT id, x.value AS item_value
      FROM json_table
      CROSS JOIN UNNEST(item_list) AS t(x);
    

    Российские решения и кейсы

  • ClickHouse как файл-источник массивов: российские проекты часто используют ClickHouse для быстрого анализа массивов и встраивают с Trino через коннектор. Примеры задач:

    • Аналитика тегов пользователей: массив тегов в ClickHouse анализируется через Trino, используя UNNEST для подсчета частоты тегов и агрегирования по сегментам аудитории.
    • Распределение заказов по артикуловой группе: массивы артикулов в заказах могут быть развёрнуты через UNNEST и агрегированы по времени и региону.
  • Архитектурная связка в реальных проектах: данные приходят из источников Kafka или лог-хранилищ, конвертируются в Parquet/ORC, хранение в хранилищах типа S3/YS3, с дальнейшим анализом через Trino и интеграцию с ClickHouse для максимально быстрого отклика по агрегациям.

Технические детали реализации (алгоритмы, схемы, протоколы, интеграции)

  • Алгоритм разворачивания массива:

    • Суть: UNNEST превращает элементы массива в набор строк с дополнительной связью к исходной строке.
    • Пример:
      
          SELECT o.order_id, x AS product_id
      ## FROM orders o
          CROSS JOIN UNNEST(o.product_ids) AS t (x);
      
  • Эффекты: создается набор пар (order_id, product_id); итоговые операции могут быть фильтрацией, агрегацией или соединением.

  • Функциональные трансформации:

    • transform(array, lambda) - применяет функцию к каждому элементу массива.
      
          SELECT order_id, transform(product_ids, x -> x * 2) AS doubled_ids
          FROM orders;
      
  • filter(array, predicate) - отбирает элементы, удовлетворяющие условию.

    • reduce(array, init, lambda) - сводит массив к единому значению через аккумулятор.
  • Манипуляции элементами:

    • element_at(array, index) - доступ к конкретному элементу.
    • slice(array, start, length) - извлечение подмассива.
    • array_sort(array) - сортировка элементов.
    • array_join(array, delimiter, null_replacement) - конкатенация элементов в строку.
    • array_contains(array, value) - наличие значения внутри массива.
    • cardinality(array) - размер массива.
  • Интеграции и переносимости:

    • Поддержка массивов в Parquet/ORC обеспечивает совместимость в разных окружениях.
    • Важна совместимость функций с коннекторами; некоторые коннекторы поддерживают pushdown часть условий по массивам, что позволяет экономить раннюю фильтрацию на уровне источника данных.
  • Безопасность и контроль доступа:

    • Реализация ограничений на уровне представлений и политик доступа, скрывающих элементы внутри массивов по правилам доступа.

       

Риски, ограничения и типовые ошибки

  • Высокая кардинальность массивов: большие массивы приводят к росту размера промежуточных таблиц после UNNEST и увеличивают сетевые расходы.
  • Карта производительности: если элементы массива требуют сложных вычислений, это может снизить производительность.
  • Неоднозначность в версиях коннекторов: функции над массивами могут работать по-разному в разных коннекторах; всегда проверяйте совместимость и поведение функций.
  • Неправильная архитектура данных: хранение больших вложенных структур в одном поле может усложнить дальнейшую эволюцию схемы и мониторинг качества данных.
  • Ограничения по памяти: операции над массивами могут потребовать больше памяти на узел; следует учитывать лимиты и планировать перераспределение памяти.

     

Перспективы развития направления

  • Расширение функциональности массивов: новые функции трансформации и оптимизации для вложенных структур, расширение возможностей predicate pushdown на коннекторах.
  • Улучшение поддержки многомерных массивов: влияние на производительность и планирование, расширение возможностей подмножества и фильтрации.
  • Интеграции с российскими решениями: углубление связок Trino с системами вроде ClickHouse для кросс-аналитики, перенос по шагам от raw данных к агрегированным массивам и их представлениям.
  • Эволюция форматов хранения: оптимизация хранения вложенных типов в Parquet/ORC и эффективные стратегии кодирования массивов для экономии дискового пространства и сетевых затрат.

Заключение
Тип ARRAY в Trino - мощный инструмент для моделирования и анализа многозначных признаков. Правильный подход к проектированию схем, выбор функций и учет ограничений памяти и производительности позволяют получать точные и оперативные результаты без лишней денормализации. Важно помнить о балансе между удобством моделирования и реальными затратами на исполнение: иногда разумнее вынести элементы массива в отдельную таблицу для поддержки горизонтального масштабирования, а иногда - сохранить компактность и прозрачность через вложенные типы. Практические кейсы на Open-source и российской экосистеме показывают, как сочетать массивы с современными коннекторами и форматами хранения для эффективной аналитики.

FAQ

  1. Что такое ARRAY в Trino и зачем он нужен?
  • ARRAY - это тип данных, позволяющий хранить последовательность элементов одного типа в одном столбце. Он удобен для моделирования множественных признаков, тегов и связанных значений без разреживания в строки. Он упрощает агрегацию по множеству значений и позволяет выполнять преобразования без дополнительной нормализации.
  1. Как работает UNNEST и когда его использовать?
  • UNNEST разворачивает массив в набор строк, что позволяет выполнять операции по элементам, например агрегации, фильтрации и соединения. Используйте UNNEST, когда аналитика требует анализа по элементам массива, а не только по коду массива целиком.
  1. Какие риски связаны с большими массивами?
  • Большая кардинальность может привести к высокой памяти и сетевым расходам, а также к увеличению времени ответа. Разворачивание больших массивов должно сопровождаться предварительной фильтрацией и разумной лимитацией.
  1. Какие функции над массивами стоит знать в первую очередь?
  • array_agg, array_distinct, array_join, element_at, cardinality, transform, filter, reduce, array_contains, slice, array_sort. Эти функции покрывают большинство распространённых сценариев анализа массивов.
  1. Как выбирать между хранением массива и нормализацией данных?
  • Если признак действительно многозначный и редко меняется, хранение как массив может быть эффективным и простым. Если же элементы требуют частого обновления, поиска по конкретному элементу или агрегаций по элементам, стоит рассмотреть отдельную таблицу и использование UNNEST.
  1. Какие сложности возникают при интеграции массивов с российскими решениями?
  • Взаимодействие с российскими продуктами, такими как ClickHouse, требует проверки совместимости форматов и поддержки вложенных типов на коннекторах. Однако такие связки часто предоставляют сильную производительность и хорошие паттерны анализа массива через совместную архитектуру.
  1. Какие практические паттерны можно привести в реальных проектах?
  • Практика 1: хранение идентификаторов в массиве и последующая агрегация через array_agg.
  • Практика 2: разворачивание массива для детального анализа по элементам, с использованием UNNEST и фильтрации.
  • Практика 3: использование transform и reduce для функционального преобразования наборов значений.
  • Практика 4: комбинирование с ClickHouse для ускорения агрегационных запросов по массивам в кросс-аналитике.
  1. Что изменится в запросах при переходе с простых типов к массивам?
  • Появляются новые функции, связанные с массивом, новые операторы (UNNEST), и новые шаблоны планирования. Нужно помнить о возможности увеличения объема промежуточных данных и обязательно тестировать производительность на рабочем наборе данных.
  1. Какие лучшие практики можно применить при моделировании массивов в больших данных?
  • Избегайте чрезмерной вложенности без блока с агрегацией, применяйте фильтры до UNNEST, используйте индексы и кэширование там, где возможно, документируйте схему и правила миграции, а также регулярно проводите мониторинг производительности для выявления узких мест.
  1. Какие перспективы развития технологий вокруг массивов в Trino?
  • Повышение эффективности predicate pushdown на коннекторах, расширение набора функций над массивами, улучшение планирования и оптимизации памяти, усиление взаимодействия с российскими решениями и экосистемами для кросс-аналитики.
← Предыдущая статья
trino s3
Следующая статья →
trino join

 

Узнать стоимость решенияЗапросить видео презентацию

Запросить видео презентацию Запросить доступ к демо стенду online Узнать стоимость лицензий

Задать вопрос

loading...

Решения

Анализировать ФинансыУвеличивайте ПродажиОптимальный Склад и ЛогистикаМаркетинговые Метрики

Клиенты
  • «Балтийский лизинг» — первая компания в России, получившая лицензию № 0001 от Министерства экономики РФ на лизинговую деятельность, лицензия зарегистрирована 2 сентября 1996 года. «Балтийский лизинг» работает на российском рынке 33 года: компания представлена 79 филиалами по всей стране, сегодня в штате более 1300 сотрудников. За последние десять лет компания профинансировала имущество для 80 000 клиентов.

  • НПФ «Будущее» — один из крупнейших негосударственных пенсионных фондов России, предоставляющий услуги по пенсионному обеспечению и накоплениям. Фонд активно внедряет цифровые технологии для повышения качества обслуживания клиентов.

  • «Синтека» — ведущий разработчик инновационных сервисов для строительной отрасли, который решает ключевые задачи автоматизации службы снабжения строительных компаний.

  • Компания «Бизон-Трейд» является официальным дилером ведущих мировых производителей сельскохозяйственной техники (Fendt, Valtra, Lemken и др.) на Юге России. Входит в состав агрохолдинга «Бизон», основанного в 1994 году. Имеет 8 филиалов в Краснодарском и Ставропольском краях, Ростовской области.

  • Решения
    • Дистрибуция
    • Розничная торговля
    • Производство
    • Операторы связи
    • Страхование
    • Банки
    • Лизинг
    • Логистика
    • Нефтегазовый сектор
    • Медицина
    • Сеть ресторанов
    • E-Commerce
    • Энергетика
    • Фармацевтика
  • Услуги
    • Переход на отечественные BI и DWH
    • Консалтинг
    • Пилотный проект
    • Обучение и сертификация
    • Бесплатное обучение
    • Техническая поддержка
    • Технические задания
    • Сбор требований для проекта внедрения BI-системы
    • CI/CD для DWH
    • Аудит BI приложений
    • Выделенная команда
    • Настойка и поддержка баз данных
    • Разработка BI Стратегии
    • Styleguide для BI-системы
    • Как выбрать BI-систему
  • Платформы
    • FineBI
    • FineReport
    • FineDataLink
    • Коннекторы данных из 1С в BI
    • Airflow + NiFi
    • Visiology
    • Luxms BI
    • Modus BI
    • PIX BI
    • Arenadata
    • ClickHouse
    • Greenplum
    • Postgres Professional
    • Open-source BI: Superset/Metabase
    • Loginom
    • Yandex.DataLens
    • AI / Исскуственный интеллект
    • Optimacros
    • Шины данных
  • Курсы
    • Учебный курс Информационная грамотность
    • Учебный курс для бизнес-аналитиков
    • Учебный курс для системных аналитиков
    • Учебный курс по Data Governance
    • Учебный курс Как стать CDO
    • Учебный курс Современная архитектура хранилища данных
    • Учебный курс по Fine BI
    • Учебный курс по FineReport
    • Учебный курс по DWH
    • Учебный курс по Data Science (ML, AI)
    • Учебный курс по PostgreSQL
    • Учебный курс по Apache Airflow и NiFi
    • Учебный курс по Open-source BI
    • Учебный курс по ClickHouse
    • Учебный курс по DataLens
    • Учебный курс по Loginom
    • Учебный курс по Modus BI и ETL
    • Учебный курс по Visiology
    • Учебный курс по dbt
  • Функциональные решения
    • Создание Data Lake
    • Цифровая трансформация
    • Управление по KPI
    • Финансы
    • Продажи
    • Склад
    • HR
    • Маркетинг
    • Внутренний аудит
    • Категорийный менеджмент
    • S&OP и прогнозная аналитика
    • Геоаналитика
    • Цепочки поставок (SCM)
    • AutoML
    • Process Mining
    • Сквозная аналитика
  • Компания
    • О нас
    • Руководство
    • Новости
    • Клиенты
    • Скачать
    • Контакты
    • Политика конфиденциальности
RutubeVkontakteLinkedInYouTube
ООО "Би Ай Консалт",
ИНН: 7811437757,
ОГРН: 1097847154184
199178, Россия,
Санкт-Петербург,
6-ая линия В.О., Д. 63, 4 этаж
Тел: +7 (812) 334-08-01
Тел: +7 (499) 608-13-06
E-mail: info@biconsult.ru

 

 

 

 

 

×

Пользуясь сайтом, вы соглашаетесь с использованием cookies и политикой конфиденциальности.