Перейти к содержимому
Последнее обновление

MAP | Сложные типы

MAP<K, V> представляет собой MAP с элементами типа K, V и обычно используется для хранения полуструктурированных данных в виде пар «ключ-значение». Подробнее см. в разделе Тип данных MAP.

В этом документе описывается, как записывать данные в столбцы типа MAP, и приводятся полные примеры для двух распространённых форматов исходных данных:

  • Загрузка в формате CSV: подходит, если данные из исходной системы представлены текстом с разделителями (учитывайте возможные конфликты между разделителем столбцов и запятыми внутри MAP).
  • Загрузка в формате JSON: подходит, если данные из исходной системы представлены массивом JSON или в формате JSON Lines.

Оба способа загрузки используют интерфейс Stream Load. Общий порядок действий:

  1. Подготовьте файл данных.
  2. Создайте таблицу в базе данных.
  3. Вызовите Stream Load с помощью curl для загрузки данных.
  4. Выполните запрос, чтобы проверить результаты.

Загрузка в формате 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.