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, с битовой картой, хранящей индексы. Roaring Bitmap используется в качестве конкретной реализации битовой карты. Лучшей практикой является максимально концентрировать индекс в нескольких контейнерах Roaring Bitmap для оптимизации сжатия и производительности запросов.
- Механизм Bit-Sliced Index преобразует значение в двоичный формат. Для типов с плавающей запятой преобразование выполняется с использованием фиксированной записи, что может привести к потере точности. Точность можно настроить путем настройки количества бит, используемых для дробной части, по умолчанию 24 бита, что достаточно для большинства сценариев. Вы можете настроить количество бит целой и дробной части при создании NumericIndexedVector с использованием агрегатной функции groupNumericIndexedVector с
-State
. - Существуют три случая для индексов: ненулевое значение, нулевое значение и несуществующее. В NumericIndexedVector хранятся только ненулевое значение и нулевое значение. Кроме того, в покоординатных операциях между двумя NumericIndexedVectors значение несуществующего индекса будет считаться равным 0. В случае деления результат равен нулю, когда делитель равен нулю.
Create a numericIndexedVector object
Существует два способа создания этой структуры: один из них — использовать агрегатную функцию groupNumericIndexedVector
с -State
. Вы можете добавить суффикс -if
, чтобы принять дополнительное условие. Агрегатная функция будет обрабатывать только строки, которые вызывают данное условие. Другой способ — построить его из карты с использованием numericIndexedVectorBuild
. Функция groupNumericIndexedVectorState
позволяет настраивать количество целых и дробных бит через параметры, тогда как numericIndexedVectorBuild
этого не делает.
groupNumericIndexedVector
Конструирует NumericIndexedVector из двух данных колонок и возвращает сумму всех значений в виде типа Float64
. Если добавлен суффикс State
, он возвращает объект NumericIndexedVector.
Синтаксис
Параметры
type
: Строка, необязательный. Указывает формат хранения. В настоящее время поддерживается только'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
, представляющее сумму всех значений.
Пример
Тестовые данные:
Запрос и результат:
numericIndexedVectorBuild
Создает NumericIndexedVector из карты. Ключи карты представляют индекс вектора, а значения карты представляют значение вектора.
Синтаксис
Аргументы
map
— Соответствие от индекса к значению.
Пример
Результат
numericIndexedVectorToMap
Конвертирует NumericIndexedVector в карту.
Синтаксис
Аргументы
numericIndexedVector
— Объект NumericIndexedVector.
Пример
Результат
numericIndexedVectorCardinality
Возвращает кардинальность (число уникальных индексов) NumericIndexedVector.
Синтаксис
Аргументы
numericIndexedVector
— Объект NumericIndexedVector.
Пример
Результат
numericIndexedVectorAllValueSum
Возвращает сумму всех значений в NumericIndexedVector.
Синтаксис
Аргументы
numericIndexedVector
— Объект NumericIndexedVector.
Пример
Результат
numericIndexedVectorGetValue
Получает значение, соответствующее указанному индексу.
Синтаксис
Аргументы
numericIndexedVector
— Объект NumericIndexedVector.index
— Индекс, для которого нужно получить значение.
Пример
Результат
numericIndexedVectorShortDebugString
Возвращает внутреннюю информацию о NumericIndexedVector в формате json. Эта функция в первую очередь используется для целей отладки.
Синтаксис
Аргументы
numericIndexedVector
— Объект NumericIndexedVector.
Пример
Результат
vector_type
: тип хранения вектора, в настоящее время поддерживается толькоBSI
.index_type
: тип индекса.value_type
: тип значения.
Следующая информация действительна для вектора типа BSI.
integer_bit_num
: количество бит, используемых для целой части.fraction_bit_num
: количество бит, используемых для дробной части.zero_indexes info
: информация об индексах со значением, равным 0cardinality
: количество индексов со значением, равным 0.
non_zero_indexes info
: информация об индексах со значением, не равным 0total_cardinality
: количество индексов со значением, не равным 0.all value sum
: сумма всех значений.number_of_bitmaps
: количество битовых карт, используемых этими индексами, которые имеют значение не 0.bitmap_info
: информация о каждой битовой картеcardinality
: количество индексов в каждой битовой карте.
numericIndexedVectorPointwiseAdd
Выполняет покоординатное сложение между NumericIndexedVector и либо другим NumericIndexedVector, либо числовой константой. Функция возвращает новый NumericIndexedVector.
Синтаксис
Аргументы
numericIndexedVector
— Объект NumericIndexedVector.numeric
- числовая константа.
Пример
Результат
numericIndexedVectorPointwiseSubtract
Выполняет покоординатное вычитание между NumericIndexedVector и либо другим NumericIndexedVector, либо числовой константой. Функция возвращает новый NumericIndexedVector.
Синтаксис
Аргументы
numericIndexedVector
— Объект NumericIndexedVector.numeric
- числовая константа.
Пример
Результат
numericIndexedVectorPointwiseMultiply
Выполняет покоординатное умножение между NumericIndexedVector и либо другим NumericIndexedVector, либо числовой константой. Функция возвращает новый NumericIndexedVector.
Синтаксис
Аргументы
numericIndexedVector
— Объект NumericIndexedVector.numeric
- числовая константа.
Пример
Результат
numericIndexedVectorPointwiseDivide
Выполняет покоординатное деление между NumericIndexedVector и либо другим NumericIndexedVector, либо числовой константой. Функция возвращает новый NumericIndexedVector. Результат равен нулю, когда делитель равен нулю.
Синтаксис
Аргументы
numericIndexedVector
— Объект NumericIndexedVector.numeric
- числовая константа.
Пример
Результат
numericIndexedVectorPointwiseEqual
Выполняет покоординатное сравнение между NumericIndexedVector и либо другим NumericIndexedVector, либо числовой константой. Результат — это NumericIndexedVector, содержащий индексы, где значения равны, со всеми соответствующими значениями, установленными в 1.
Синтаксис
Аргументы
numericIndexedVector
— Объект NumericIndexedVector.numeric
- числовая константа.
Пример
Результат
numericIndexedVectorPointwiseNotEqual
Выполняет покоординатное сравнение между NumericIndexedVector и либо другим NumericIndexedVector, либо числовой константой. Результат — это NumericIndexedVector, содержащий индексы, где значения не равны, со всеми соответствующими значениями, установленными в 1.
Синтаксис
Аргументы
numericIndexedVector
— Объект NumericIndexedVector.numeric
- числовая константа.
Пример
Результат
numericIndexedVectorPointwiseLess
Выполняет покоординатное сравнение между NumericIndexedVector и либо другим NumericIndexedVector, либо числовой константой. Результат — это NumericIndexedVector, содержащий индексы, где значение первого вектора меньше значения второго вектора, со всеми соответствующими значениями, установленными в 1.
Синтаксис
Аргументы
numericIndexedVector
— Объект NumericIndexedVector.numeric
- числовая константа.
Пример
Результат
numericIndexedVectorPointwiseLessEqual
Выполняет покоординатное сравнение между NumericIndexedVector и либо другим NumericIndexedVector, либо числовой константой. Результат — это NumericIndexedVector, содержащий индексы, где значение первого вектора меньше либо равно значению второго вектора, со всеми соответствующими значениями, установленными в 1.
Синтаксис
Аргументы
numericIndexedVector
— Объект NumericIndexedVector.numeric
- числовая константа.
Пример
Результат
numericIndexedVectorPointwiseGreater
Выполняет покоординатное сравнение между NumericIndexedVector и либо другим NumericIndexedVector, либо числовой константой. Результат — это NumericIndexedVector, содержащий индексы, где значение первого вектора больше значения второго вектора, со всеми соответствующими значениями, установленными в 1.
Синтаксис
Аргументы
numericIndexedVector
— Объект NumericIndexedVector.numeric
- числовая константа.
Пример
Результат
numericIndexedVectorPointwiseGreaterEqual
Выполняет покоординатное сравнение между NumericIndexedVector и либо другим NumericIndexedVector, либо числовой константой. Результат — это NumericIndexedVector, содержащий индексы, где значение первого вектора больше либо равно значению второго вектора, со всеми соответствующими значениями, установленными в 1.
Синтаксис
Аргументы
numericIndexedVector
— Объект NumericIndexedVector.numeric
- числовая константа.
Пример
Результат