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

dict_mapping

Описание

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

Эта функция в основном используется для упрощения применения глобальной таблицы словаря. Во время загрузки данных в целевую таблицу Selena автоматически получает значение, сопоставленное с указанным ключом из таблицы словаря, используя входные параметры этой функции, а затем загружает это значение в целевую таблицу.

Начиная с версии 1.5.0, Selena поддерживает эту функцию. Также обратите внимание, что в настоящее время режим shared-data в Selena не поддерживает эту функцию.

Синтаксис

dict_mapping("[<db_name>.]<dict_table>", key_column_expr_list [, <value_column> ] [, <null_if_not_exist>] )

key_column_expr_list ::= key_column_expr [, key_column_expr ... ]

key_column_expr ::= <column_name> | <expr>

Параметры

  • Обязательные параметры:

    • [<db_name>.]<dict_table>: Имя таблицы словаря, которая должна быть таблицей с Primary Key. Поддерживаемый тип данных — VARCHAR.

    • key_column_expr_list: Список выражений для ключевых столбцов в таблице словаря, включающий одно или несколько key_column_exprs. key_column_expr может быть именем ключевого столбца в таблице словаря или конкретным ключом или выражением ключа.

      Этот список выражений должен включать все столбцы Primary Key таблицы словаря, что означает, что общее количество выражений должно соответствовать общему количеству столбцов Primary Key в таблице словаря. Поэтому когда таблица словаря использует Composite Primary Key, выражения в этом списке должны соответствовать столбцам Primary Key, определенным в схеме таблицы, по порядку. Несколько выражений в этом списке разделяются запятыми (,). И если key_column_expr является конкретным ключом или выражением ключа, его тип должен соответствовать типу соответствующего столбца Primary Key в таблице словаря.

  • Необязательные параметры:

    • <value_column>: Имя столбца значений, который также является столбцом сопоставления. Если столбец значений не указан, столбцом значений по умолчанию является столбец AUTO_INCREMENT таблицы словаря. Столбец значений также может быть определен как любой столбец в таблице словаря, исключая автоинкрементные столбцы и первичные ключи. Тип данных столбца не имеет ограничений.
    • <null_if_not_exist> (Необязательный): Возвращать ли null, если ключ не существует в таблице словаря. Допустимые значения:
      • true: Возвращается Null, если ключ не существует.
      • false (По умолчанию): Выбрасывается исключение, если ключ не существует.

Возвращаемое значение

Тип данных возвращаемых значений остается согласованным с типом данных столбца значений. Если столбец значений является автоинкрементным столбцом таблицы словаря, тип данных возвращаемых значений — BIGINT.

Однако, когда значение, сопоставленное с указанным ключом, не найдено, если параметр <null_if_not_exist> установлен в true, возвращается NULL. Если параметр установлен в false (по умолчанию), возвращается ошибка query failed if record not exist in dict table.

Пример

Пример 1: Прямой запрос значения, сопоставленного с ключом из таблицы словаря.

  1. Создайте таблицу словаря и загрузите смоделированные данные.

    MySQL [test]> CREATE TABLE dict (
    order_uuid STRING,
    order_id_int BIGINT AUTO_INCREMENT
    )
    PRIMARY KEY (order_uuid)
    DISTRIBUTED BY HASH (order_uuid);
    Query OK, 0 rows affected (0.02 sec)

    MySQL [test]> 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'}

    MySQL [test]> SELECT * FROM dict;
    +------------+--------------+
    | order_uuid | order_id_int |
    +------------+--------------+
    | a1 | 1 |
    | a3 | 3 |
    | a2 | 2 |
    +------------+--------------+
    3 rows in set (0.01 sec)

    ВНИМАНИЕ

    В настоящее время оператор INSERT INTO не поддерживает частичные обновления. Поэтому убедитесь, что значения, вставляемые в ключевой столбец dict, не дублируются. В противном случае вставка одного и того же значения ключевого столбца в таблицу словаря несколько раз приводит к изменению его сопоставленного значения в столбце значений.

  2. Запросите значение, сопоставленное с ключом a1 в таблице словаря.

    MySQL [test]> SELECT dict_mapping('dict', 'a1');
    +----------------------------+
    | dict_mapping('dict', 'a1') |
    +----------------------------+
    | 1 |
    +----------------------------+
    1 row in set (0.01 sec)

Пример 2: Столбец сопоставления в таблице настроен как генерируемый столбец с использованием функции dict_mapping. Таким образом, Selena может автоматически получать значения, сопоставленные с ключами, при загрузке данных в эту таблицу.

  1. Создайте таблицу данных и настройте столбец сопоставления как генерируемый столбец, используя dict_mapping('dict', order_uuid).

    CREATE TABLE dest_table1 (
    id BIGINT,
    -- Этот столбец записывает номер заказа типа STRING, соответствующий столбцу order_uuid в таблице dict из Примера 1.
    order_uuid STRING,
    batch int comment 'used to distinguish different batch loading',
    -- Этот столбец записывает номер заказа типа BIGINT, который сопоставлен со столбцом order_uuid.
    -- Поскольку этот столбец является генерируемым столбцом, настроенным с dict_mapping, значения в этом столбце автоматически получаются из таблицы dict из Примера 1 во время загрузки данных.
    -- Впоследствии этот столбец может быть напрямую использован для дедупликации и JOIN-запросов.
    order_id_int BIGINT AS dict_mapping('dict', order_uuid)
    )
    DUPLICATE KEY (id, order_uuid)
    DISTRIBUTED BY HASH(id);
  2. При загрузке смоделированных данных в эту таблицу, где столбец order_id_int настроен как dict_mapping('dict', 'order_uuid'), Selena автоматически загружает значения в столбец order_id_int на основе отношения сопоставления между ключами и значениями в таблице dict.

    MySQL [test]> INSERT INTO dest_table1(id, order_uuid, batch) VALUES (1, 'a1', 1), (2, 'a1', 1), (3, 'a3', 1), (4, 'a3', 1);
    Query OK, 4 rows affected (0.05 sec)
    {'label':'insert_e191b9e4-8a98-11ee-b29c-00163e03897d', 'status':'VISIBLE', 'txnId':'72'}

    MySQL [test]> SELECT * FROM dest_table1;
    +------+------------+-------+--------------+
    | id | order_uuid | batch | order_id_int |
    +------+------------+-------+--------------+
    | 1 | a1 | 1 | 1 |
    | 4 | a3 | 1 | 3 |
    | 2 | a1 | 1 | 1 |
    | 3 | a3 | 1 | 3 |
    +------+------------+-------+--------------+
    4 rows in set (0.02 sec)

    Использование dict_mapping в этом примере может ускорить вычисления дедупликации и JOIN-запросы. По сравнению с предыдущими решениями для построения глобального словаря для ускорения точной дедупликации, решение с использованием dict_mapping более гибкое и удобное для пользователя. Поскольку значения сопоставления получаются напрямую из таблицы словаря на этапе "загрузки отношений сопоставления между ключами и значениями в таблицу". Вам не нужно писать операторы для соединения с таблицей словаря для получения значений сопоставления. Кроме того, это решение поддерживает различные методы загрузки данных.

Пример 3: Если столбец сопоставления в таблице не настроен как генерируемый столбец, вам нужно явно настроить функцию dict_mapping для столбца сопоставления при загрузке данных в таблицу, чтобы получить значения, сопоставленные с ключами.

ВНИМАНИЕ

Разница между Примером 3 и Примером 2 заключается в том, что при импорте в таблицу данных вам нужно изменить команду импорта, чтобы явно настроить выражение dict_mapping для столбца сопоставления.

  1. Создайте таблицу.

    CREATE TABLE dest_table2 (
    id BIGINT,
    order_uuid STRING,
    order_id_int BIGINT NULL,
    batch int comment 'used to distinguish different batch loading'
    )
    DUPLICATE KEY (id, order_uuid, order_id_int)
    DISTRIBUTED BY HASH(id);
  2. Когда смоделированные данные загружаются в эту таблицу, вы получаете сопоставленные значения из таблицы словаря, настраивая dict_mapping.

    MySQL [test]> INSERT INTO dest_table2 VALUES (1, 'a1', dict_mapping('dict', 'a1'), 1);
    Query OK, 1 row affected (0.35 sec)
    {'label':'insert_19872ab6-8a96-11ee-b29c-00163e03897d', 'status':'VISIBLE', 'txnId':'42'}

    MySQL [test]> SELECT * FROM dest_table2;
    +------+------------+--------------+-------+
    | id | order_uuid | order_id_int | batch |
    +------+------------+--------------+-------+
    | 1 | a1 | 1 | 1 |
    +------+------------+--------------+-------+
    1 row in set (0.02 sec)

Пример 4: Включение режима null_if_not_exist

Когда режим <null_if_not_exist> отключен и запрашивается значение, сопоставленное с ключом, который не существует в таблице словаря, возвращается ошибка, а не NULL. Это гарантирует, что ключ строки данных сначала загружается в таблицу словаря и генерируется его сопоставленное значение (ID словаря), прежде чем эта строка данных загружается в целевую таблицу.

MySQL [test]>  SELECT dict_mapping('dict', 'b1', true);
ERROR 1064 (HY000): Query failed if record not exist in dict table.

Пример 5: Если таблица словаря использует составные первичные ключи, все первичные ключи должны быть указаны при запросе.

  1. Создайте таблицу словаря с Composite Primary Keys и загрузите в неё смоделированные данные.

    MySQL [test]> CREATE TABLE dict2 (
    order_uuid STRING,
    order_date DATE,
    order_id_int BIGINT AUTO_INCREMENT
    )
    PRIMARY KEY (order_uuid,order_date) -- Composite Primary Key
    DISTRIBUTED BY HASH (order_uuid,order_date)
    ;
    Query OK, 0 rows affected (0.02 sec)

    MySQL [test]> INSERT INTO dict2 VALUES ('a1','2023-11-22',default), ('a2','2023-11-22',default), ('a3','2023-11-22',default);
    Query OK, 3 rows affected (0.12 sec)
    {'label':'insert_9e60b0e4-89fa-11ee-a41f-b22a2c00f66b', 'status':'VISIBLE', 'txnId':'15029'}


    MySQL [test]> select * from dict2;
    +------------+------------+--------------+
    | order_uuid | order_date | order_id_int |
    +------------+------------+--------------+
    | a1 | 2023-11-22 | 1 |
    | a3 | 2023-11-22 | 3 |
    | a2 | 2023-11-22 | 2 |
    +------------+------------+--------------+
    3 rows in set (0.01 sec)
  2. Запросите значение, сопоставленное с ключом в таблице словаря. Поскольку таблица словаря имеет Composite Primary Keys, все первичные ключи должны быть указаны в dict_mapping.

    SELECT dict_mapping('dict2', 'a1', cast('2023-11-22' as DATE));

    Обратите внимание, что возникает ошибка, когда указан только один Primary Key.

    MySQL [test]> SELECT dict_mapping('dict2', 'a1');
    ERROR 1064 (HY000): Getting analyzing error. Detail message: dict_mapping function param size should be 3 - 5.