MAP | Сложные типы
MAP<K, V> представляет собой MAP с элементами типа K, V и обычно используется для хранения полуструктурированных данных в виде пар «ключ-значение». Подробнее см. в разделе Тип данных MAP.
В этом документе описывается, как записывать данные в столбцы типа MAP, и приводятся полные примеры для двух распространённых форматов исходных данных:
- Загрузка в формате CSV: подходит, если данные из исходной системы представлены текстом с разделителями (учитывайте возможные конфликты между разделителем столбцов и запятыми внутри MAP).
- Загрузка в формате JSON: подходит, если данные из исходной системы представлены массивом JSON или в формате JSON Lines.
Оба способа загрузки используют интерфейс Stream Load. Общий порядок действий:
- Подготовьте файл данных.
- Создайте таблицу в базе данных.
- Вызовите Stream Load с помощью
curlдля загрузки данных. - Выполните запрос, чтобы проверить результаты.
Загрузка в формате CSV
Шаг 1: Подготовьте данные
Создайте CSV-файл test_map.csv со следующим содержимым. В качестве разделителя столбцов используется | вместо запятой, чтобы избежать конфликта с запятыми внутри MAP.
1|{"Emily":101,"age":25}
2|{"Benjamin":102}
3|{}
4|null
Значение каждой строки файла описано ниже:
| Строка | Значение |
|---|---|
1|{"Emily":101,"age":25} | MAP с двумя парами «ключ-значение» |
2|{"Benjamin":102} | MAP с одной парой «ключ-значение» |
3|{} | Пустой MAP |
4|null | Значение NULL |
Шаг 2: Создайте таблицу в базе данных
CREATE TABLE map_test (
id INT NOT NULL,
c_map MAP<STRING, INT> NULL
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);
Шаг 3: Загрузите данные
Загрузите CSV-файл с помощью Stream Load. Назначение основных заголовков приведено в таблице ниже.
curl --location-trusted \
-u "root":"" \
-H "column_separator:|" \
-H "columns: id, c_map" \
-T "test_map.csv" \
http://localhost:8040/api/testdb/map_test/_stream_load
| Заголовок | Назначение |
|---|---|
| `column_separator: | ` |
columns: id, c_map | Задаёт соответствие между столбцами файла и столбцами таблицы |
Шаг 4: Проверьте загруженные данные
mysql> SELECT * FROM map_test;
+------+-------------------------+
| id | c_map |
+------+-------------------------+
| 1 | {"Emily":101, "age":25} |
| 2 | {"Benjamin":102} |
| 3 | {} |
| 4 | NULL |
+------+-------------------------+
4 rows in set (0.01 sec)
Загрузка в формате JSON
Шаг 1: Подготовьте данные
Создайте JSON-файл test_map.json со следующим содержимым. Весь файл представляет собой массив JSON, каждый элемент которого соответствует одной строке данных.
[
{"id":1, "c_map":{"Emily":101, "age":25}},
{"id":2, "c_map":{"Benjamin":102}},
{"id":3, "c_map":{}},
{"id":4, "c_map":null}
]
Шаг 2: Создайте таблицу в базе данных
CREATE TABLE map_test (
id INT NOT NULL,
c_map MAP<STRING, INT> NULL
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 1
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);
Шаг 3: Загрузите данные
Загрузите JSON-файл с помощью Stream Load. Назначение основных заголовков приведено в таблице ниже.
curl --location-trusted \
-u "root":"" \
-H "format:json" \
-H "columns: id, c_map" \
-H "strip_outer_array:true" \
-T "test_map.json" \
http://localhost:8040/api/testdb/map_test/_stream_load
| Заголовок | Назначение |
|---|---|
format:json | Указывает JSON в качестве формата данных |
strip_outer_array:true | Если входные данные представляют собой массив JSON, обрабатывает каждый элемент массива как отдельную строку |
columns: id, c_map | Задаёт соответствие между полями JSON и столбцами таблицы |
Шаг 4: Проверьте загруженные данные
mysql> SELECT * FROM map_test;
+------+-------------------------+
| id | c_map |
+------+-------------------------+
| 1 | {"Emily":101, "age":25} |
| 2 | {"Benjamin":102} |
| 3 | {} |
| 4 | NULL |
+------+-------------------------+
4 rows in set (0.01 sec)
Часто задаваемые вопросы
Вопрос 1: Почему не следует использовать запятую в качестве разделителя столбцов в CSV?
В литерале MAP запятые уже используются для разделения пар «ключ-значение» (например, {"Emily":101,"age":25}). Если использовать запятую также в качестве разделителя столбцов, разбор данных станет неоднозначным. Рекомендуется использовать символы, которые не встречаются в содержимом MAP, например | или \t.
Вопрос 2: Зачем нужен strip_outer_array:true при загрузке массива JSON?
Если на внешнем уровне JSON-файла находится массив (как в примере из этого документа), необходимо задать strip_outer_array:true, чтобы Doris обрабатывал каждый элемент массива как отдельную строку данных. Если файл уже имеет формат JSON Lines (по одному объекту в строке), этот параметр не требуется.
Вопрос 3: Как обозначить пустой MAP и NULL?
- Пустой MAP: записывайте как
{}в CSV и как{}в JSON. - Значение NULL: записывайте как
nullв CSV и какnullв JSON. Целевой столбец должен допускатьNULL.