Трансформация nest в Vega используется для преобразования плоских наборов данных в иерархическую структуру. Она группирует записи по одному или нескольким ключам, создавая вложенные массивы внутри каждого узла. Такой подход особенно полезен при построении иерархий, фасетных структур и подготовке данных для вложенных визуализаций.
Базовая идея заключается в том, что набор строк преобразуется в дерево:
В Vega трансформация nest задаётся как объект с
указанием полей группировки:
{
"type": "nest",
"keys": ["category", "subcategory"]
}
Каждый ключ добавляет уровень вложенности. Порядок ключей определяет структуру дерева: первый уровень — верхняя группировка, далее — вложенные группы.
При обработке данных:
Считываются строки входного набора.
Формируется группа по первому ключу.
Внутри каждой группы формируются подгруппы по следующему ключу.
Результатом становится дерево узлов, где каждый узел содержит:
values или аналогичную структуру с дочерними
элементами[
{ "region": "EU", "country": "Germany", "value": 10 },
{ "region": "EU", "country": "France", "value": 20 },
{ "region": "ASIA", "country": "Japan", "value": 30 }
]
region → country[
{
"key": "EU",
"values": [
{
"key": "Germany",
"values": [
{ "region": "EU", "country": "Germany", "value": 10 }
]
},
{
"key": "France",
"values": [
{ "region": "EU", "country": "France", "value": 20 }
]
}
]
}
]
Иерархическая структура, полученная через nest,
применяется в:
Vega использует результат nest как основу для
layout-алгоритмов, которые ожидают иерархию.
Трансформация flatten выполняет противоположную задачу: она преобразует вложенные массивы в плоскую структуру строк. Это один из ключевых инструментов нормализации данных, особенно когда вход содержит массивы значений в одном поле.
{
"type": "flatten",
"fields": ["values"]
}
Поле fields определяет, какие массивы будут развернуты.
Каждый элемент массива становится отдельной строкой.
Алгоритм flatten:
[
{
"category": "A",
"values": [1, 2, 3]
},
{
"category": "B",
"values": [4, 5]
}
]
[
{ "category": "A", "values": 1 },
{ "category": "A", "values": 2 },
{ "category": "A", "values": 3 },
{ "category": "B", "values": 4 },
{ "category": "B", "values": 5 }
]
В Vega-Lite flatten применяется для подготовки данных
к:
Пример спецификации Vega-Lite:
{
"data": {
"values": [
{ "id": 1, "scores": [10, 20, 30] }
]
},
"transform": [
{
"flatten": ["scores"]
}
],
"mark": "point",
"encoding": {
"x": { "field": "scores", "type": "quantitative" },
"y": { "field": "id", "type": "nominal" }
}
}
Обе трансформации работают с изменением структуры данных, но направлены в противоположные стороны.
В сложных пайплайнах Vega допускается последовательное применение обеих трансформаций:
nest.flatten для гибридных структур.Пример сценария:
Трансформация поддерживает несколько массивов одновременно:
{
"type": "flatten",
"fields": ["scores", "errors"]
}
В этом случае каждый элемент обоих массивов разворачивается параллельно, формируя комбинации значений. При несовпадающей длине массивов поведение зависит от конфигурации обработки данных и может приводить к частичной синхронизации элементов.
При использовании nest часто возникает необходимость
предварительной агрегации:
После агрегирования flatten может применяться для
восстановления плоского представления с сохранёнными вычисленными
значениями.
В Vega трансформации реализованы как часть dataflow-архитектуры:
nest изменяет структуру потока, создавая вложенные
объектыflatten разрушает структуру и перераспределяет элементы
потокаВажный аспект заключается в том, что порядок трансформаций напрямую влияет на итоговый результат:
flatten → nest даёт сгруппированные данные из
нормализованного источникаnest → flatten может привести к частичной потере
структуры и повторному развертыванию данныхflatten применяется к логам, где события содержат
массивы метрикnest используется для группировки по пользователям и
временным интерваламnest формирует иерархию регион → страна → городflatten разворачивает списки координат для точечного
анализаflatten развертывает серии измеренийnest группирует данные по временным окнам и
категориямflatten игнорирует пустые массивы, не создавая новых
строкnest формирует группы с пустыми массивами
values, если отсутствуют элементы на нижнем уровнеnest могут приводить к значительным
затратам памяти при больших наборах данныхflatten увеличивает количество строк экспоненциально
при длинных массивах