NumericIndexedVector
NumericIndexedVector — это абстрактная структура данных, которая инкапсулирует вектор и реализует агрегирующие и покомпонентные операции над векторами. В качестве формата хранения в ней используется Bit-Sliced Index. Теоретические основы и сценарии использования описаны в статье Large-Scale Metric Computation in Online Controlled Experiment Platform.
BSI
В методе хранения BSI (Bit-Sliced Index) данные сохраняются в формате Bit-Sliced Index, а затем сжимаются с помощью Roaring Bitmap. Операции агрегации и покомпонентные операции выполняются непосредственно над сжатыми данными, что может значительно повысить эффективность хранения и выполнения запросов.
Вектор содержит индексы и соответствующие им значения. Ниже перечислены некоторые характеристики и ограничения этой структуры данных в режиме хранения BSI:
- Тип индекса может быть одним из
UInt8,UInt16илиUInt32. Примечание: Учитывая производительность 64-битной реализации Roaring Bitmap, формат BSI не поддерживаетUInt64/Int64. - Тип значения может быть одним из
Int8,Int16,Int32,Int64,UInt8,UInt16,UInt32,UInt64,Float32илиFloat64. Примечание: Тип значения не расширяется автоматически. Например, если вы используетеUInt8как тип значения, любая сумма, превышающая диапазонUInt8, приведёт к переполнению, а не к повышению типа; аналогично, операции над целыми числами будут возвращать целочисленные результаты (например, деление не будет автоматически преобразовано в результат с плавающей запятой). Поэтому важно заранее продумать и спроектировать тип значения. На практике обычно используются типы с плавающей запятой (Float32/Float64). - Операции могут выполняться только над двумя векторами с одинаковым типом индекса и типом значения.
- Базовое хранилище использует Bit-Sliced Index, при этом индексы хранятся в виде битовой карты (bitmap). Roaring Bitmap используется как конкретная реализация битовой карты. Рекомендуемой практикой является максимальная концентрация индексов в небольшом числе контейнеров Roaring Bitmap, чтобы максимально повысить степень сжатия и производительность выполнения запросов.
- Механизм Bit-Sliced Index преобразует значение в двоичное представление. Для типов с плавающей запятой используется фиксированно-точечное представление, что может привести к потере точности. Точность можно настраивать, задавая количество бит для дробной части; по умолчанию используется 24 бита, чего достаточно для большинства сценариев. Вы можете задать количество бит для целой и дробной части при создании NumericIndexedVector с помощью агрегатной функции groupNumericIndexedVector с суффиксом
-State. - Для индексов возможны три состояния: ненулевое значение, нулевое значение и отсутствие. В NumericIndexedVector хранятся только ненулевые и нулевые значения. Кроме того, при покомпонентных операциях между двумя NumericIndexedVector значение отсутствующего индекса трактуется как 0. В сценарии деления результат также равен нулю, если делитель равен нулю.
Создание объекта numericIndexedVector
Существует два способа создать эту структуру: первый — использовать агрегатную функцию groupNumericIndexedVector с суффиксом -State.
Вы можете добавить суффикс -if, чтобы задать дополнительное условие.
Агрегатная функция будет обрабатывать только те строки, для которых выполняется это условие.
Второй способ — построить её из значения типа Map с помощью numericIndexedVectorBuild.
Функция groupNumericIndexedVectorState позволяет настроить количество целых и дробных битов через параметры, в то время как numericIndexedVectorBuild такой возможности не предоставляет.
groupNumericIndexedVector
Создает NumericIndexedVector из двух столбцов данных и возвращает сумму всех значений как значение типа Float64. Если добавить суффикс State, возвращает объект NumericIndexedVector.
Синтаксис
Параметры
type: String, необязательный. Определяет формат хранения. В настоящее время поддерживается только'BSI'.integer_bit_num:UInt32, необязательный. Актуален для формата хранения'BSI'. Этот параметр задаёт количество бит, используемых для целой части. Если тип индекса является целочисленным, значение по умолчанию соответствует количеству бит, используемых для хранения индекса. Например, если тип индекса — UInt16, значениеinteger_bit_numпо умолчанию равно 16. Для типов индекса Float32 и Float64 значениеinteger_bit_numпо умолчанию равно 40, поэтому целая часть данных, которую можно представить, находится в диапазоне[-2^39, 2^39 - 1]. Допустимый диапазон —[0, 64].fraction_bit_num:UInt32, необязательный. Актуален для формата хранения'BSI'. Этот параметр задаёт количество бит, используемых для дробной части. Когда тип значения — целочисленный, значение по умолчанию равно 0; когда тип значения — Float32 или Float64, значение по умолчанию равно 24. Допустимый диапазон —[0, 24].- Дополнительно накладывается ограничение: допустимый диапазон для
integer_bit_num + fraction_bit_num—[0, 64]. col1: Индексный столбец. Поддерживаемые типы:UInt8/UInt16/UInt32/Int8/Int16/Int32.col2: Столбец значений. Поддерживаемые типы:Int8/Int16/Int32/Int64/UInt8/UInt16/UInt32/UInt64/Float32/Float64.
Возвращаемое значение
Значение типа Float64, представляющее сумму всех значений.
Пример
Тестовые данные:
Запрос и результат:
Приведённая ниже документация сгенерирована из системной таблицы system.functions.
numericIndexedVectorAllValueSum
Добавлена в версии: v25.7
Возвращает сумму всех значений в numericIndexedVector.
Синтаксис
Аргументы
Возвращаемое значение
Возвращает сумму. Float64
Примеры
Пример использования
numericIndexedVectorBuild
Появилось в: v25.7
Создаёт NumericIndexedVector из отображения (map). Ключи отображения задают индекс вектора, а значения — элементы вектора.
Синтаксис
Аргументы
map— отображение индекса в значение.Map
Возвращаемое значение
Возвращает объект NumericIndexedVector. AggregateFunction
Примеры
Пример использования
numericIndexedVectorCardinality
Впервые представлена в: v25.7
Возвращает кардинальность (число уникальных индексов) объекта numericIndexedVector.
Синтаксис
Аргументы
Возвращаемое значение
Возвращает число уникальных индексов. UInt64
Примеры
Пример использования
numericIndexedVectorGetValue
Появилась в версии: v25.7
Извлекает значение, соответствующее указанному индексу, из numericIndexedVector.
Синтаксис
Аргументы
v—numericIndexedVectori— Индекс, по которому извлекается значение.(U)Int*
Возвращаемое значение
Числовое значение того же типа, что и тип значений NumericIndexedVector: (U)Int* или Float*
Примеры
Пример использования
numericIndexedVectorPointwiseAdd
Представлен в версии: v25.7
Выполняет покомпонентное сложение между numericIndexedVector и другим numericIndexedVector или числовой константой.
Синтаксис
Аргументы
v1—numericIndexedVectorv2— числовая константа или объект типаnumericIndexedVector.(U)Int*илиFloat*илиnumericIndexedVector
Возвращаемое значение
Возвращает новый объект типа numericIndexedVector. numericIndexedVector
Примеры
Пример использования
numericIndexedVectorPointwiseDivide
Введён в версии: v25.7
Выполняет покомпонентное деление между numericIndexedVector и другим numericIndexedVector или числовой константой.
Синтаксис
Аргументы
v1—numericIndexedVectorv2— числовая константа или объект типа numericIndexedVector.(U)Int*илиFloat*илиnumericIndexedVector
Возвращаемое значение
Возвращает новый объект типа numericIndexedVector. numericIndexedVector
Примеры
Пример использования
numericIndexedVectorPointwiseEqual
Введено в: v25.7
Выполняет покомпонентное сравнение между numericIndexedVector и другим numericIndexedVector или числовой константой.
Результатом является numericIndexedVector, содержащий индексы элементов, значения которых равны, при этом всем соответствующим значениям присваивается 1.
Синтаксис
Аргументы
v1— объект типаnumericIndexedVectorv2— числовая константа или объект типа numericIndexedVector:(U)Int*,Float*илиnumericIndexedVector
Возвращаемое значение
Возвращает новый объект типа numericIndexedVector. numericIndexedVector
Примеры
numericIndexedVectorPointwiseGreater
Появилась в версии: v25.7
Выполняет покомпонентное сравнение между numericIndexedVector и другим numericIndexedVector либо числовой константой.
Результатом является numericIndexedVector, содержащий индексы, для которых значение первого вектора больше значения второго, при этом все соответствующие значения устанавливаются равными 1.
Синтаксис
Аргументы
v1—numericIndexedVectorv2— числовая константа или объект типаnumericIndexedVector.(U)Int*илиFloat*илиnumericIndexedVector
Возвращаемое значение
Возвращает новый объект типа numericIndexedVector. numericIndexedVector
Примеры
Пример использования
numericIndexedVectorPointwiseGreaterEqual
Введено в: v25.7
Выполняет поэлементное сравнение между numericIndexedVector и другим numericIndexedVector или числовой константой.
Результатом является numericIndexedVector, содержащий индексы позиций, где значение первого вектора больше либо равно значению второго вектора, при этом все соответствующие значения устанавливаются равными 1.
Синтаксис
Аргументы
v1—numericIndexedVectorv2— числовая константа или объект типаnumericIndexedVector.(U)Int*илиFloat*илиnumericIndexedVector
Возвращаемое значение
Возвращает новый объект типа numericIndexedVector. numericIndexedVector
Примеры
Пример использования
numericIndexedVectorPointwiseLess
Впервые представлено в: v25.7
Выполняет покомпонентное сравнение numericIndexedVector либо с другим numericIndexedVector, либо с числовой константой.
Результатом является numericIndexedVector, содержащий индексы, где значение первого вектора меньше значения второго, при этом все соответствующие значения равны 1.
Синтаксис
Аргументы
v1—numericIndexedVectorv2— числовая константа или объектnumericIndexedVector.(U)Int*илиFloat*илиnumericIndexedVector
Возвращаемое значение
Возвращает новый объект numericIndexedVector. numericIndexedVector
Примеры
Пример использования
numericIndexedVectorPointwiseLessEqual
Добавлена в: v25.7
Выполняет поэлементное сравнение между numericIndexedVector и другим numericIndexedVector или числовой константой.
Результатом является numericIndexedVector, содержащий индексы, для которых значение первого вектора меньше либо равно значению второго вектора, при этом все соответствующие значения установлены в 1.
Синтаксис
Аргументы
v1—numericIndexedVectorv2— числовая константа или объектnumericIndexedVectorтипов(U)Int*илиFloat*
Возвращаемое значение
Возвращает новый объект numericIndexedVector.
Примеры
Пример использования
numericIndexedVectorPointwiseMultiply
Введено в: v25.7
Выполняет поэлементное умножение между numericIndexedVector и другим numericIndexedVector или числовой константой.
Синтаксис
Аргументы
v1—numericIndexedVectorv2— числовая константа или объект типаnumericIndexedVector.(U)Int*илиFloat*илиnumericIndexedVector
Возвращаемое значение
Возвращает новый объект типа numericIndexedVector. numericIndexedVector
Примеры
numericIndexedVectorPointwiseNotEqual
Впервые появился в: v25.7
Выполняет покомпонентное сравнение между numericIndexedVector и либо другим numericIndexedVector, либо числовой константой.
Результатом является numericIndexedVector, содержащий индексы, для которых значения не равны, при этом все соответствующие значения равны 1.
Синтаксис
Аргументы
v1—numericIndexedVectorv2— числовая константа или объект типаnumericIndexedVector.(U)Int*илиFloat*илиnumericIndexedVector
Возвращаемое значение
Возвращает новый объект типа numericIndexedVector.
Примеры
Пример использования
numericIndexedVectorPointwiseSubtract
Представлено в: v25.7
Выполняет покомпонентное вычитание между numericIndexedVector и другим numericIndexedVector или числовой константой.
Синтаксис
Аргументы
v1—numericIndexedVectorv2— числовая константа или объектnumericIndexedVector:(U)Int*илиFloat*илиnumericIndexedVector
Возвращаемое значение
Возвращает новый объект numericIndexedVector. numericIndexedVector
Примеры
Пример использования
numericIndexedVectorShortDebugString
Появилась в версии: v25.7
Возвращает внутреннюю информацию о numericIndexedVector в формате JSON. Эта функция в основном используется для отладки.
Синтаксис
Аргументы
Возвращаемое значение
Возвращает JSON-строку с отладочной информацией. String
Примеры
Пример использования
numericIndexedVectorToMap
Впервые появилась в версии v25.7
Преобразует значение типа numericIndexedVector в map.
Синтаксис
Аргументы
Возвращаемое значение
Возвращает отображение Map с парами индекс–значение.
Примеры
Пример использования