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

CREATE DICTIONARY

Создает объект словаря на основе исходного объекта. Объект словаря организует сопоставления ключ-значение из исходного объекта в виде хеш-таблицы и кэшируется в памяти всех BE узлов. Его можно рассматривать как кэшированную таблицу.

Преимущества

  • Более богатые исходные объекты для объектов словаря: При использовании dictionary_get() для запроса объектов словаря исходный объект может быть таблицей любого типа, асинхронным материализованным представлением или логическим представлением. Однако при использовании dict_mapping() для запроса таблиц словаря, таблицы словаря могут быть только таблицами с первичным ключом.
  • Высокая скорость запросов: Поскольку объект словаря является хеш-таблицей и полностью кэшируется в памяти всех BE узлов, запрос к объекту словаря для получения сопоставления реализуется путем поиска в хеш-таблице в памяти. Поэтому скорость запросов очень высока.
  • Поддержка нескольких столбцов значений: Внутренне объект словаря кодирует несколько столбцов значений в один столбец типа STRUCT. Для запросов на основе ключа возвращается несколько значений вместе. Поэтому объект словаря может служить таблицей измерений, где каждый ключ (обычно уникальный идентификатор) соответствует нескольким значениям (описательные атрибуты).
  • Обеспечивает согласованные снимки чтения: Снимок словаря, полученный в рамках одной транзакции, является согласованным, гарантируя, что результаты запросов из объекта словаря не изменяются во время одного и того же процесса запроса или загрузки.

Синтаксис

CREATE DICTIONARY <dictionary_object_name> USING <dictionary_source>
(
column_name KEY, [..., column_name KEY,]
column_name VALUE[, ..., column_name VALUE]
)
[PROPERTIES ("key"="value", ...)];

Параметры

  • dictionary_object_name: Имя объекта словаря. Объект словаря действует глобально и не принадлежит конкретной базе данных.
  • dictionary_source: Имя исходного объекта, на котором основан объект словаря. Исходный объект может быть таблицей любого типа, асинхронным материализованным представлением или логическим представлением.
  • Определение столбцов в объекте словаря: Для сохранения сопоставления ключ-значение, поддерживаемого в таблице словаря, необходимо использовать ключевые слова KEY и VALUE в столбцах объекта словаря для указания ключей и их сопоставленных значений.
    • Имена столбцов column_name в объекте словаря должны соответствовать именам в таблице словаря.
    • Типы данных для столбцов ключей и значений в объекте словаря ограничены булевыми, целочисленными, строковыми типами и типами дат.
    • Столбец ключа в исходном объекте должен обеспечивать уникальность.
  • Связанные свойства объектов словаря (PROPERTIES):
    • dictionary_warm_up: Метод кэширования данных в объект словаря на каждом BE узле. Допустимые значения: TRUE (по умолчанию) или FALSE. Если параметр установлен в TRUE, данные автоматически кэшируются в объект словаря после его создания; если параметр установлен в FALSE, необходимо вручную обновить объект словаря для кэширования данных.
    • dictionary_memory_limit: Максимальная память, которую может занимать объект словаря на каждом BE узле. Единица: байты. Значение по умолчанию: 2,000,000,000 байт (2 ГБ).
    • dictionary_refresh_interval: Интервал для периодического обновления объекта словаря. Единица: секунды. Значение по умолчанию: 0. Значение <=0 означает отсутствие автоматического обновления.
    • dictionary_read_latest: Запрашивать ли только последний объект словаря, в основном влияет на объект словаря, запрашиваемый во время обновления. Допустимые значения: TRUE или FALSE (по умолчанию). Если параметр установлен в TRUE, объект словаря нельзя запрашивать во время обновления, поскольку последний объект словаря все еще обновляется. Если параметр установлен в FALSE, ранее успешно кэшированный объект словаря можно запрашивать во время обновления.
    • dictionary_ignore_failed_refresh: Автоматически ли откатываться к последнему успешно кэшированному объекту словаря в случае неудачного обновления. Допустимые значения: TRUE или FALSE (по умолчанию). Если параметр установлен в TRUE, происходит автоматический откат к последнему успешно кэшированному объекту словаря при неудачном обновлении. Если параметр установлен в FALSE, статус объекта словаря устанавливается в CANCELLED при неудачном обновлении.

Примечания по использованию

  • Объект словаря полностью кэшируется в памяти каждого BE узла, поэтому потребляет относительно больше памяти.
  • Даже если исходный объект удален, объект словаря, созданный на его основе, все еще существует. Необходимо вручную удалить объект словаря с помощью DROP.

Примеры

Пример 1: Создание простого объекта словаря для замены исходной таблицы словаря.

Возьмем следующую таблицу словаря в качестве примера и вставим тестовые данные.

CREATE TABLE dict (
order_uuid STRING,
order_id_int BIGINT AUTO_INCREMENT
)
PRIMARY KEY (order_uuid)
DISTRIBUTED BY HASH (order_uuid);
INSERT INTO dict (order_uuid) VALUES ('a1'), ('a2'), ('a3');
Query OK, 3 rows affected (0.12 sec)
{'label':'insert_9e60b0e4-89fa-11ee-a41f-b22a2c00f66b', 'status':'VISIBLE', 'txnId':'15029'}
SELECT * FROM dict;
+------------+--------------+
| order_uuid | order_id_int |
+------------+--------------+
| a1 | 1 |
| a2 | 2 |
| a3 | 3 |
+------------+--------------+
3 rows in set (0.01 sec)

Создаем объект словаря на основе сопоставлений в этой таблице словаря.

CREATE DICTIONARY dict_obj USING dict
(order_uuid KEY,
order_id_int VALUE);

Для будущих запросов сопоставлений в таблице словаря можно напрямую запрашивать объект словаря вместо таблицы словаря. Например, запросим значение, сопоставленное с ключом a1.

SELECT dictionary_get("dict_obj", "a1");
+--------------------+
| DICTIONARY_GET |
+--------------------+
| {"order_id_int":1} |
+--------------------+
1 row in set (0.01 sec)

Пример 2: Создание объекта словаря для замены исходной таблицы измерений

Возьмем следующую таблицу измерений в качестве примера и вставим тестовые данные.

CREATE TABLE ProductDimension (
ProductKey BIGINT AUTO_INCREMENT,
ProductName VARCHAR(100) NOT NULL,
Category VARCHAR(50),
SubCategory VARCHAR(50),
Brand VARCHAR(50),
Color VARCHAR(20),
Size VARCHAR(20)
)
PRIMARY KEY (ProductKey)
DISTRIBUTED BY HASH (ProductKey);
INSERT INTO ProductDimension (ProductName, Category, SubCategory, Brand, Color, Size)
VALUES
('T-Shirt', 'Apparel', 'Shirts', 'BrandA', 'Red', 'M'),
('Jeans', 'Apparel', 'Pants', 'BrandB', 'Blue', 'L'),
('Running Shoes', 'Footwear', 'Athletic', 'BrandC', 'Black', '10'),
('Jacket', 'Apparel', 'Outerwear', 'BrandA', 'Green', 'XL'),
('Baseball Cap', 'Accessories', 'Hats', 'BrandD', 'White', 'OneSize');
Query OK, 5 rows affected (0.48 sec)
{'label':'insert_e938481f-181e-11ef-a6a9-00163e19e14e', 'status':'VISIBLE', 'txnId':'50'}
SELECT * FROM ProductDimension;
+------------+---------------+-------------+-------------+--------+-------+---------+
| ProductKey | ProductName | Category | SubCategory | Brand | Color | Size |
+------------+---------------+-------------+-------------+--------+-------+---------+
| 1 | T-Shirt | Apparel | Shirts | BrandA | Red | M |
| 2 | Jeans | Apparel | Pants | BrandB | Blue | L |
| 3 | Running Shoes | Footwear | Athletic | BrandC | Black | 10 |
| 4 | Jacket | Apparel | Outerwear | BrandA | Green | XL |
| 5 | Baseball Cap | Accessories | Hats | BrandD | White | OneSize |
+------------+---------------+-------------+-------------+--------+-------+---------+
5 rows in set (0.02 sec)

Создаем объект словаря для замены исходной таблицы измерений.

CREATE DICTIONARY dimension_obj USING ProductDimension 
(ProductKey KEY,
ProductName VALUE,
Category VALUE,
SubCategory VALUE,
Brand VALUE,
Color VALUE,
Size VALUE);
Query OK, 0 rows affected (0.00 sec)

Для будущих запросов значений измерений можно напрямую запрашивать объект словаря вместо таблицы измерений для получения значений измерений. Например, запросим значение, сопоставленное с ключом 1.

SELECT dictionary_get("dict_obj", "a1");
1 row in set (0.01 sec)
+-----------------------------------------+
| DICTIONARY_GET('dict_obj', 'a1', false) |
+-----------------------------------------+
| {"order_id_int":1} |
+-----------------------------------------+