Перейти к основному содержимому
Версия: 2.0.x

encode_sort_key

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

Синтаксис

encode_sort_key(column1, column2, ..., columnN)

Параметры

  • column1, column2, ..., columnN: один или несколько столбцов любого поддерживаемого типа данных. Функция принимает переменное количество аргументов.

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

Возвращает значение типа VARBINARY, представляющее составной ключ сортировки.

Поддерживаемые типы данных

Поддерживаются следующие типы данных:

Тип данныхОписание
TINYINT8-битное знаковое целое
SMALLINT16-битное знаковое целое
INT32-битное знаковое целое
BIGINT64-битное знаковое целое
LARGEINT128-битное знаковое целое
FLOAT32-битное число с плавающей точкой
DOUBLE64-битное число с плавающей точкой
VARCHARСтрока переменной длины
CHARСтрока фиксированной длины
DATEЗначение даты
DATETIMEЗначение даты и времени
TIMESTAMPЗначение временной метки

Следующие сложные типы не поддерживаются и вернут ошибку:

  • JSON
  • ARRAY
  • MAP
  • STRUCT
  • HLL
  • BITMAP
  • PERCENTILE

Стратегия кодирования

Функция использует различные стратегии кодирования для разных типов данных, чтобы гарантировать, что лексикографическое сравнение результирующих бинарных ключей сохраняет исходный порядок сортировки:

  • Целочисленные типы: порядок байтов big-endian с инвертированным битом знака для знаковых типов
  • Типы с плавающей точкой: специальное кодирование для обеспечения правильного порядка сортировки
  • Строковые типы: специальное кодирование с экранированием байта 0x00 и терминатором 0x00 0x00 для непоследних полей
  • Типы даты/времени: внутреннее целочисленное представление, закодированное как целочисленное значение

Обработка NULL

  • Каждый столбец получает маркер NULL (0x00 для NULL, 0x01 для NOT NULL) для каждой строки
  • Маркеры NULL добавляются даже для ненулевых столбцов для обеспечения согласованного кодирования
  • Байт-разделитель (0x00) используется между столбцами (кроме последнего столбца)

Примеры

Сгенерированный столбец ключа сортировки

CREATE TABLE user_analytics (
user_id INT,
region VARCHAR(50),
score DOUBLE,
created_date DATE,
sort_key VARBINARY(1024) AS (
encode_sort_key(region, score, created_date)
)
) ORDER BY (sort_key);

Извлечение полей JSON

CREATE TABLE json_data (
id INT,
json_content JSON,
sort_key VARBINARY(1024) AS (
encode_sort_key(
get_json_int(json_content, '$.priority'),
get_json_string(json_content, '$.category'),
get_json_double(json_content, '$.score')
)
)
) ORDER BY (sort_key);

Ограничения

Ограничения типов данных

Сложные типы, такие как JSON, ARRAY, MAP и STRUCT, не могут быть закодированы напрямую. Используйте функции извлечения JSON для получения примитивных значений:

-- Вместо: encode_sort_key(json_col)
-- Используйте: encode_sort_key(get_json_int(json_col, '$.field1'), get_json_string(json_col, '$.field2'))

Соображения производительности

  • Каждый вызов encode_sort_key требует кодирования всех входных столбцов
  • Бинарные ключи могут быть значительно больше исходных данных
  • Используйте сгенерированные столбцы, чтобы избежать повторного кодирования

Ограничения размера ключа

  • Количество столбцов должно быть разумным (обычно < 10)
  • Предпочитайте более короткие строковые столбцы, когда это возможно
  • Рассмотрите использование хеш-функций для очень длинных строк