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

Преобразование полей с множественными значениями

Поле с множественными значениями (многозначное поле) — это поле, которое содержит более одного значения. Например, журнал электронной почты имеет многозначные поля «Кому:», «Копия:», или журнал интернет-магазина содержит поле со списком товаров.

Ниже представлены основные команды для работы с многозначными полями.

mvappend

Объединение полей.

Запрос создаст поле event_info, которое соберёт в себе информацию нескольких других полей. Количество параметров, подаваемых в функцию mvappend может иметь различное число, отличных от нуля.

source sm_cs_auth_indexes
| table user.name, source.ip, event.action
| eval event_info = mvappend(user.name, source.ip, event.action)

mvcount

Подсчет количества значений многозначных полей.

Как и в случае атомарных значений полей, многозначные поля также можно посчитать. Для этого существует команда mvcount. Запрос создаст список событий поля event.action группируя по полю source.ip, а далее выполняется команда mvcount которая считает количество значений в поле event.action.

source sm_cs_auth_indexes
| stats values(event.action) as event.action by source.ip
| eval source_number = mvcount(event.action)

mvfilter

Фильтрация многозначных полей.

Запрос создаст новые поля logged_in и logged, используя функции mvfilter и match, которые помогут выделить согласно шаблонам нужные значение в поле event.action. Внутри команды mvfilter используются различные функции совпадений (например, match, cidrmatch, in и т.д.).

source sm_cs_auth_indexes
| stats values(event.action) as event.action by source.ip
| eval source_number = mvcount(event.action)
| eval logged_in = mvfilter(match(event.action, "logged-in"))
| eval logged = mvfilter(match(event.action, "logged-(.*)"))

mvjoin

Принимает на вход имя многозначного поля, значение конкатенатора и возвращает строку со всеми значениями через конкатенатор.

Запрос ищет в индексе среди первых 100000 значений число событий (заказов), группируя заказы по идентификатору пользователя (user_id), далее выполняет конкатенацию значений поля product (список продуктов в заказе) с использованием конкатенатора ",". При выводе таблицы выполнится сортировка выводимых значений. В столбце product выполнена сортировка значений. В столбце result действительный порядок значений в поле product. Действительный порядок значений важен при работе с индексами значений. Поэтому, рекомендуется использовать сортировку значений полей при помощи команды mvsort.

source food_orders qsize=100000
| stats count, values(items) as product by user_id
| eval result=mvjoin(product, ", ")
| table user_id, product, result

mvsort

Принимает имя многозначного поля и выполняет внутри него сортировку.

Запрос ищет в индексе среди первых 100000 значений число событий (заказов), группируя заказы по идентификатору пользователя (user_id), далее выполняет сортировку (mvsort) значений внутри поля product (список продуктов в заказе), далее выполняет конкатенацию значений поля product (список продуктов в заказе) с использованием конкатенатора ", ".

source food_orders qsize=100000
| stats count, values(items) as product by user_id
| eval product=mvsort(product)
| eval result=mvjoin(product, ", ")
| table user_id, product, result

mvfind

Принимает на вход параметр и возвращает индекс первого найденного совпадения. Индекс начинается с 0.

Запрос ищет в индексе среди первых 100000 значений число событий (заказов), группируя заказы по идентификатору пользователя (user_id), далее выполняет сортировку (mvsort) значений внутри поля product (список продуктов в заказе), и возвращает индекс первого найденного совпадения по шаблону "C(.*)" в поле product. Нумерация индексов элементов многозначного поля начинается с нуля.

source food_orders qsize=100000
| stats count, values(items) as product by user_id
| eval product=mvsort(product)
| eval result=mvfind(product, "C(.*)")
| table result, user_id, product

mvindex

Принимает на вход параметр и номер искомого индекса в многозначном поле. Возвращает значение или null, если не найдено.

Запрос ищет в индексе среди первых 100000 значений число событий (заказов), группируя заказы по идентификатору пользователя (user_id), далее выполняет сортировку (mvsort) значений внутри поля product (список продуктов в заказе), и возвращает индекс первого найденного совпадения по шаблону "C(.*)" в поле product, а полю result_index присваивается значений 7-го элемента поля product.

source food_orders qsize=100000
| stats count, values(items) as product by user_id
| eval product=mvsort(product)
| eval result=mvfind(product, "C(.*)")
| eval result_index=mvindex(product, 7)
| table result, result_index, user_id, product

mvrange

Принимает на вход параметры начала, конца и интервала инкремента (опционально). Возвращает многозначное поле со списком чисел согласно заданным параметрам

source food_orders qsize=100000
| eval range=mvrange(1,50,1)
| table range

mvzip

Принимает многозначные поля и выполняет конкатенацию (через запятые) значений первого поля со вторым (согласно порядку индексов значений первого поля). Если у одного из многозначных полей значений больше, чем в остальных, конкатенация по этим значениям не будет выполнена.

Запрос ищет в индексе среди первых 100000 значений число событий (заказов), группируя заказы по идентификатору пользователя (user_id), далее выполняет сортировку (mvsort) значений внутри поля product (список продуктов в заказе), затем создается многозначное поле(range) с диапазоном значений от 1 до 50, далее формируется итоговый список(rezult_zip) из значений поля range и product, далее к последнему значению поля result_zip добавляется ";" (поле result_append), далее, так как диапазоны значений полей различаются, удаляются "лишние" номера и получаем итоговый список - поле result_replace.

source food_orders qsize=100000
| stats count, values(items) as product by user_id
| eval product=mvsort(product)
| eval range=mvrange(1,50,1)
| eval result_zip=mvzip(range,product)
| eval result_join=mvjoin(result_zip, "; ")
| eval result_append=mvappend(result_join + ";")
| eval result_replace = replace(result_append, "[0-9]+;", "")
| table user_id, result_zip, result_join, result_append, result_replace

split

Принимает на вход строку и разделитель. Возвращает многозначное поле, отформатированное с разделителем.

В следующем запросе будут выполнены те же операции, что и в предыдущем, но результирующее поле result_replace будет разделено по шаблону разделителя "; " и выполнена сортировка значений поля result_split .

source food_orders qsize=100000
| stats count, values(items) as product by user_id
| eval product=mvsort(product)
| eval range=mvrange(1,50,1)
| eval result_zip=mvzip(range,product)
| eval result_join=mvjoin(result_zip, "; ")
| eval result_append=mvappend(result_join + ";")
| eval result_replace=replace(result_append, "[0-9]+;", "")
| eval result_split=split(result_replace, "; ")
| eval result_split=mvsort(result_split)
| table user_id, result_zip, result_join, result_append, result_replace, result_split

mvdedup

Дедупликация значений в многозначных полях.

Запрос ищет в индексе среди первых 100000 значений число событий (заказов), группируя заказы по идентификатору пользователя (user_id). В отличии от команды values которая сохраняет только уникальные значения в поле, команда list формирует список из всех значений. Поэтому в поле product появятся дубликаты. Команда mvdedup удалит дубликаты значений в поле product, а результат выполнения присвоит полю result_dedup.

source food_orders qsize=100000
| stats count, list(items) as product by user_id
| eval result_dedup=mvdedup(product)
| table product, result_dedup, user_id