Nested(name1 Type1, Name2 Type2, ...)
Вложенная структура данных похожа на таблицу внутри ячейки. Параметры вложенной структуры данных – названия и типы колонок – указываются так же, как в запросе CREATE TABLE. Каждая строка таблицы может соответствовать любому количеству строк во вложенной структуре данных.
Пример:
CREATE TABLE test.visits
(
CounterID UInt32,
StartDate Date,
Sign Int8,
IsNew UInt8,
VisitID UInt64,
UserID UInt64,
...
Goals Nested
(
ID UInt32,
Serial UInt32,
EventTime DateTime,
Price Int64,
OrderID String,
CurrencyID UInt32
),
...
) ENGINE = CollapsingMergeTree(StartDate, intHash32(UserID), (CounterID, StartDate, intHash32(UserID), VisitID), 8192, Sign)
Этот пример объявляет вложенную структуру данных Goals
, которая содержит данные о конверсиях (достигнутых целях). Каждая строка в таблице 'visits' может соответствовать нулю или любому количеству конверсий.
Когда flatten_nested установлен в 0
(что не является значением по умолчанию), поддерживаются произвольные уровни вложенности.
В большинстве случаев, при работе с вложенной структурой данных, её колонки указываются с названиями колонок, разделёнными точкой. Эти колонки составляют массив соответствующих типов. Все массивы колонок одной вложенной структуры данных имеют одинаковую длину.
Пример:
SELECT
Goals.ID,
Goals.EventTime
FROM test.visits
WHERE CounterID = 101500 AND length(Goals.ID) < 5
LIMIT 10
┌─Goals.ID───────────────────────┬─Goals.EventTime───────────────────────────────────────────────────────────────────────────┐
│ [1073752,591325,591325] │ ['2014-03-17 16:38:10','2014-03-17 16:38:48','2014-03-17 16:42:27'] │
│ [1073752] │ ['2014-03-17 00:28:25'] │
│ [1073752] │ ['2014-03-17 10:46:20'] │
│ [1073752,591325,591325,591325] │ ['2014-03-17 13:59:20','2014-03-17 22:17:55','2014-03-17 22:18:07','2014-03-17 22:18:51'] │
│ [] │ [] │
│ [1073752,591325,591325] │ ['2014-03-17 11:37:06','2014-03-17 14:07:47','2014-03-17 14:36:21'] │
│ [] │ [] │
│ [] │ [] │
│ [591325,1073752] │ ['2014-03-17 00:46:05','2014-03-17 00:46:05'] │
│ [1073752,591325,591325,591325] │ ['2014-03-17 13:28:33','2014-03-17 13:30:26','2014-03-17 18:51:21','2014-03-17 18:51:45'] │
└────────────────────────────────┴───────────────────────────────────────────────────────────────────────────────────────────┘
Проще всего думать о вложенной структуре данных как о наборе нескольких массивов колонок одинаковой длины.
Единственное место, где запрос SELECT может указать имя всей вложенной структуры данных вместо отдельных колонок, является оператор ARRAY JOIN. Для получения дополнительной информации см. "Оператор ARRAY JOIN". Пример:
SELECT
Goal.ID,
Goal.EventTime
FROM test.visits
ARRAY JOIN Goals AS Goal
WHERE CounterID = 101500 AND length(Goals.ID) < 5
LIMIT 10
┌─Goal.ID─┬──────Goal.EventTime─┐
│ 1073752 │ 2014-03-17 16:38:10 │
│ 591325 │ 2014-03-17 16:38:48 │
│ 591325 │ 2014-03-17 16:42:27 │
│ 1073752 │ 2014-03-17 00:28:25 │
│ 1073752 │ 2014-03-17 10:46:20 │
│ 1073752 │ 2014-03-17 13:59:20 │
│ 591325 │ 2014-03-17 22:17:55 │
│ 591325 │ 2014-03-17 22:18:07 │
│ 591325 │ 2014-03-17 22:18:51 │
│ 1073752 │ 2014-03-17 11:37:06 │
└─────────┴─────────────────────┘
Вы не можете выполнять SELECT для всей вложенной структуры данных. Вы можете только явно перечислять отдельные колонки, которые являются её частью.
Для запроса INSERT вы должны передать все составные массивы колонок вложенной структуры данных отдельно (как если бы это были отдельные массивы колонок). Во время вставки система проверяет, что они имеют одинаковую длину.
Для запроса DESCRIBE колонки во вложенной структуре данных перечисляются отдельно тем же способом.
Запрос ALTER для элементов во вложенной структуре данных имеет ограничения.