Языки OTL и SMaLL
Команды OTL
OTL – Open Technology Language – высокоуровневый язык для работы с данными, не требующий от пользователя навыков программирования.
Язык OTL применяется в интерактивной среде разработки EVA для создания поисковых запросов к различным источникам данных для последующей визуализации и анализа данных.
Структура поиска на языке OTL выглядит следующим образом:
данные из индекса <аргументы> | команда1 <аргументы> | команда2 <аргументы> | ...
Запрос состоит из серии команд, разделенных конвейером (|), который принимает выходные данные одной команды и передает их в следующую.
Команды в запросе используются для получения индексированных данных, фильтрации нежелательной и извлечения дополнительной информации, вычисления значений и проведения статистического анализа.
Результаты поиска, извлеченные из индекса, можно рассматривать как динамически создаваемую таблицу.
В документе представлены команды языка OTL.
Описание каждой команды снабжено многочисленными примерами, позволяющими наглядно продемонстрировать её возможности в решении разноплановых задач обработки данных.
Команда | Действие | Пример |
---|---|---|
addcoltotals | Добавляет сумму каждого числового поля в конец набора результатов запроса. | ... | addcoltotals labelfield=Total label=Flights |
addinfo | Добавляет к каждому событию информацию о времени и идентификаторе запроса, в результате выполнения которого получена запись. | ... | addinfo |
addtotals | Вычисляет арифметическую сумму числовых полей для каждого результата запроса. | ... | addtotals Germany Russia USA fieldname=SUM |
append | Добавляет результаты подзапроса, как новые записи текущего запроса. | ... | append [search index=access_web_server | top 1 clientip by method] |
appendcols | Добавляет результаты подзапроса, как новые поля текущего запроса. | ... | appendcols [serach index=LA_Air] |
appendpipe | Добавляет дополнительные преобразования (subpipeline) к результатам основного запроса. | ... | appendpipe [| eval SUM=TerminalA+TerminalB+TerminalC] |
bin | Отображает значения поля в дискретный набор значений. | ... | bin bins=3 testField |
chart | Группирует записи по указанному полю. | ... | chart count(Population) by Country |
collect | Сохраняет результаты запроса в указанном индексе. | ... | collect index=transactions_russia source=transactions sourcetype=transactions |
command | Использует функции Spark. | ... | command empty_check=isnotnull(phrase) |
convert | Конвертирует значения поля в числовые значения. | ... | convert ctime(<testField>) |
dedup | Удаляет события с повторяющимися значениями полей. | ... | table Terminal, Arrival_Departure| dedup Terminal |
delta | Вычисляет разницу между текущим значением поля и его значением несколькими записями ранее. | ... | where currency="EUR" | sort _time | delta sum as delta_sum_eur |
eval | Создаёт новое поле и заполняет его вычисленными значениями. | ... | eval currency_low=lower(currency) |
eventstats | Считает статистику из значений полей без трансформации исходных данных. | ... | eventstats max(temperature) as temperature |
fields | Отображает только указанные поля. Синоним команды table. | ... | fields testField1 testField2 |
fieldsummary | Отображает количество значений, максимальное, среднее, минимальное значения и стандартное отклонение для каждого поля. | ... | fieldsummary |
filldown | Заполняет пропуски значениями из предыдущей записи. | ... | filldown |
fillnull | Заполняет пропуски указанным значением. | ... | fillnull value="noValue" |
filter | Фильтрует записи в зависимости от заданного условия. Синоним команды search. | ... | filter {"query": "!(Terminal=\"Terminal 6\")"} |
foreach | Для каждого из полей выполняет шаблонный подзапрос. | ... | foreach test* [eval sum=test1+test2] |
head | Отображает заданное количество первых записей запроса. | ... | head 3 |
inputlookup | Загружает данные из csv-файла. | | inputlookup testTable.csv |... |
join | Объединяет результаты поискового подзапроса с результатами основного запроса. | search index=... | join [ index=... ] |
lookup | Добавляет данные из внешней таблицы. | ... | lookup students.csv Name, age |
makemv | Конвертирует поле, состоящее из одного значения, в поле, состоящее из нескольких значений. | ... | makemv testFied delim=";" |
makeresults | Создает (генерирует) требуемое количество результатов поиска. | | makeresults count=3 | ... |
mvcombine | Группирует записи, отличающиеся только значениями в отдельных полях. | ... | mvcombine testField |
mvexpand | Преобразует событие с полем из нескольких значений в несколько отдельных событий. | ... | mvexpand fields |
nomv | Конвертирует поле, состоящее из нескольких значений, в поле, состоящее из одного значения (в строку). | ... | nomv testField |
otloadjob | Извлекает из кеша результаты ранее выполненного запроса. | otloadjob spl="index=\"apache\" | ... |
otstats | Получает проиндексированные данные из индекса. | otstats index="linux-log" severity="ERR*" | ... |
outputlookup | Сохраняет результаты запроса в статическую таблицу (lookup). | ... | outputlookup transactions_eur.csv |
rangemap | Преобразует числовое поле в текстовое по заданному правилу. | ... | rangemap field=sum min=1-5 med=6-15 max=16-30 |
rare | Находит наименее распространённые значения в выбранных полях. | ... | rare 2 Name |
rename | Переименовывает одно или несколько полей. | ... | rename dest as "destination country" |
replace | Заменяет значение поля указанным значением. | ... | replace oldValue1 newValue in testField |
return | Используется в подзапросах для подстановки в исходный запрос значения из определенной колонки полученного набора данных. | ... | return avgTemp] - 1) > 0.05 |
reverse | Получает записи в обратном порядке. | ... | reverse |
rex | Применяет регулярное выражение к указанному полю. | ... | rex field=testField ".*(?<new_host>Q)(?<new_host2>.*)" |
search | Получает необработанные данные из индекса. Синоним команды filter. | search index="linux-log" |
sort | Сортирует результаты по заданному полю. | ... | sort testField |
spath | Извлекает информацию из структурированных данных в формате JSON. | ... | spath input=github_response output=commit_author path=commits{}.author.name |
stats | Применяет агрегирующую функцию к полю. | ... | stats max(testField) |
streamstats | Вычисляет статистику по значениям полей в "потоковом" режиме и добавляет поле результата к каждому событию. | ... | streamstats sum(testField) window=5 |
superjoin | Объединяет результаты из таблицы на диске с результатами основного запроса. | … | superjoin id, day type=left format=parquet path=folder/table1 |
table | Отображает только указанные поля. Синоним команды fields. | ... | table testField1 testField2 |
tail | Отображает заданное количество последних записей запроса. | ... | tail 3 |
timechart | Агрегирует результаты по времени. | ... | timechart span=2d sum(Air_traffic) by Terminal |
top | Получает наиболее часто встречающиеся значения указанных полей, количество таких значений и их процент среди общего количества значений. | … | top 3 testField |
transaction | Находит среди множества записей, сгруппированных по указанному набору полей, первую по времени запись (в своей группе). | ... | transaction deposit, well, metric_name, value |
transpose | Превращает строки таблицы в столбцы и наоборот. | ... | transpose |
untable | Преобразует данные из широкой таблицы в длинную таблицу. | ... | untable _time, metric_name, value |
where | Отфильтровывает записи согласно заданным условиям. | ... | where Population > 1000000 |
xyseries | Конвертирует результаты в пригодный для визуализации табличный формат. | ... | xyseries testField1 |
ADDCOLTOTALS
Команда добавляет сумму каждого числового поля в конец набора результатов запроса. Если указан аргумент labelfield, в таблицу результатов добавляется столбец с указанным именем.
Синтаксис команды
addcoltotals [labelfield=<fieldname>] [label=<string>]
Опциональные параметры:
-
labelfield=<fieldname> – определяет имя поля для добавления в набор результатов.
-
label=<string> – используется с аргументом labelfield для добавления метки в итоговое событие. Если аргумент labelfield отсутствует, аргумент label не имеет никакого эффекта.
Примеры использования
Пример 1.
Добавляет общую сумму всех транзакций в конец набора результатов поля sum:
Исходные данные:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD | Russia | 7 |
1587045130 | EUR | Germany | 21 |
1587045140 | EUR | USA | 3 |
1587045150 | RUB | Germany | 19 |
1587045160 | EUR | Russia | 7 |
Запрос:
... | addcoltotals labelfield=All_Transactions
Результат:
datetime | currency | dest | sum | All_Transactions |
---|---|---|---|---|
1587045110 | RUB | Russia | 10 | |
1587045120 | USD | Russia | 7 | |
1587045130 | EUR | Germany | 21 | |
1587045140 | EUR | USA | 3 | |
1587045150 | RUB | Germany | 19 | |
1587045160 | EUR | Russia | 7 | |
67 | Total |
Пример 2.
Выводит количество рейсов (вылетов и прилетов) по всем терминалам аэропорта:
Исходные данные:
Terminal | Arrivals | Departures |
---|---|---|
Terminal1 | 80000 | 40000 |
Terminal2 | 30000 | 50000 |
Terminal3 | 60000 | 90000 |
Запрос:
... | addcoltotals labelfield=Total label=Flights
Результат:
Terminal | Arrivals | Departures | Total |
---|---|---|---|
Terminal1 | 80000 | 40000 | |
Terminal2 | 30000 | 50000 | |
Terminal3 | 60000 | 90000 | |
170000 | 180000 | Flights |
ADDINFO
Команда добавляет поля, общую информацию об идентификаторе запроса и временных интервалах.
Синтаксис команды
addinfo
Следующие поля добавляются к каждому событию при использовании команды addinfo:
Поле | Описание |
---|---|
info_min_time | Самая ранняя временная граница для поиска. |
info_max_time | Самая поздняя временная граница для поиска. |
info_sid | Идентификатор поиска, который сгенерировал событие. |
Примеры использования
Пример 1
Добавляет служебную информацию о поиске к каждому событию.
Исходные данные:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD | Russia | 7 |
1587045130 | EUR | Germany | 21 |
1587045140 | EUR | USA | 3 |
1587045150 | RUB | Germany | 19 |
1587045160 | EUR | Russia | 7 |
Запрос:
... | addinfo
Результат:
datetime | currency | dest | sum | info_min_time | info_max_time | info_sid |
---|---|---|---|---|---|---|
1587045110 | RUB | Russia | 10 | 1587045000 | 1587048000 | 13102 |
1587045120 | USD | Russia | 7 | 1587045000 | 1587048000 | 13102 |
1587045130 | EUR | Germany | 21 | 1587045000 | 1587048000 | 13102 |
1587045140 | EUR | USA | 3 | 1587045000 | 1587048000 | 13102 |
1587045150 | RUB | Germany | 19 | 1587045000 | 1587048000 | 13102 |
1587045160 | EUR | Russia | 7 | 1587045000 | 1587048000 | 13102 |
ADDTOTALS
Команда вычисляет арифметическую сумму числовых полей для каждого результата запроса. Сумма помещается в новое поле. Если установлен параметр col = true, команда addtotals добавляет сумму каждого числового поля в конец набора результатов запроса. Кроме того, вместо использования команды addtotals с параметром col = true, можно использовать команду addcoltotals для вычисления итогового события.
Синтаксис команды
addtotals [row=<bool>] [fieldname=<field>] [col=<bool>] [labelfield=<field>] [label=<string>] <field-list>
Обязательный параметр:
- field-list – одно или несколько числовых полей для вычисления суммирующего значения.
Опциональные параметры:
-
row=<bool> – указывает, следует ли рассчитывать сумму field-list для каждого события. Это похоже на вычисление итога для каждой строки в таблице. Сумма помещается в новое поле. Имя поля по умолчанию – Total. Если необходимо указать другое имя для поля, используется параметр fieldname. Значение по умолчанию: true.
-
fieldname=<field> – используется для указания имени поля, которое содержит рассчитанную сумму списка полей для каждого события. Параметр fieldname действителен только тогда, когда row = true.
-
col=<bool> – указывает на необходимость добавления нового события, называемого сводным событием, вниз списка событий. Сводное событие отображает сумму каждого поля в событиях, аналогично вычислению итоговых значений столбцов в таблице.
Значение по умолчанию: false.
-
labelfield=<field> – используется для указания поля метки сводного события. Аргумент labelfield действителен только тогда, когда col = true.
-
label=<string> – используется для указания метки строки для сводного события.
Примеры использования
Пример 1
Выводит размер транзакций по каждой из валют в разрезе стран и считает с помощью команды addtotals общую сумму:
Исходные данные:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD | Russia | 7 |
1587045130 | EUR | Germany | 21 |
1587045140 | EUR | USA | 3 |
1587045150 | RUB | Germany | 19 |
1587045160 | EUR | Russia | 7 |
Запрос:
...
| chart sum(sum) over currency by dest
| fillnull
| addtotals Germany Russia USA fieldname=SUM
Результат:
currency | Germany | Russia | USA | SUM |
---|---|---|---|---|
EUR | 21 | 7 | 3 | 31 |
RUB | 19 | 10 | 0 | 29 |
USD | 0 | 7 | 0 | 7 |
Пример 2
Считает общее количество прилётов в аэропорту за каждые сутки и для каждого терминала за все дни.
Исходные данные:
Terminal | Date | Arrivals | Departures |
---|---|---|---|
TerminalA | 27.03.2019 | 235 | 321 |
TerminalB | 27.03.2019 | 178 | 167 |
TerminalC | 27.03.2019 | 79 | 68 |
TerminalA | 28.03.2019 | 216 | 278 |
TerminalB | 28.03.2019 | 165 | 145 |
TerminalC | 28.03.2019 | 64 | 60 |
TerminalA | 29.03.2019 | 223 | 216 |
TerminalB | 29.03.2019 | 143 | 120 |
TerminalC | 29.03.2019 | 87 | 98 |
Запрос:
...
| chart sum(Arrivals) by Terminal over Date
| addtotals fieldname=Arrivals/day col=true labelfield=Arrivals/Terminal TerminalA TerminalB TerminalC
В этом примере используется команда chart для представления количества прибывающих рейсов в разрезе даты и терминала аэропорта.
Результат:
Date | Terminal A | Terminal B | Terminal C | Arrivals/day | Arrivals/Terminal |
---|---|---|---|---|---|
27.03.2019 | 235 | 178 | 79 | 492 | |
28.03.2019 | 216 | 165 | 64 | 445 | |
29.03.2019 | 223 | 143 | 87 | 453 | |
674 | 486 | 230 | 1390 | Total |
APPEND (UNION)
Команда добавляет результаты подзапроса к текущим результатам. Синоним команды – union.
Синтаксис команды
append <subsearch>
Обязательный параметр:
- subsearch – дополнительный запрос, результаты выполнения которого необходимо добавить. Подзапрос должен быть заключен в квадратные скобки.
Примеры использования
Пример 1
Подсчитывает количество различных IP-адресов, с которых обращались к веб-серверу. Затем находит пользователя, который обращался к веб-серверу в разрезе типа запроса (method).
Исходные данные:
_time | clientip | method |
---|---|---|
2020-04-20 18:22:16 | 91.205.189.15 | GET |
2020-04-20 18:20:56 | 182.236.164.11 | GET |
2020-04-20 18:18:59 | 198.35.1.75 | GET |
2020-04-20 18:16:29 | 221.204.246.72 | POST |
... | ... | ... |
Запрос:
index=access_web_server
| stats dc(clientip), count by method
| append [search index=access_web_server | top 1 clientip by method]
Результат:
method | dc(clientip) | count | clientip | percent |
---|---|---|---|---|
GET | 182 | 24866 | ||
POST | 182 | 14666 | ||
GET | 651 | 87.194.216.51 | 2.618033 | |
POST | 385 | 87.194.216.51 | 2.625119 |
Пример 2.
Выводит статистику по транзакциям (самые частые и редкие валюты, самые маленькие и большие суммы транзакций, топ мест назначения) в разрезе стран.
Исходные данные:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD | Russia | 7 |
1587045130 | EUR | Germany | 21 |
1587045140 | EUR | USA | 3 |
1587045150 | RUB | Germany | 19 |
1587045160 | EUR | Russia | 7 |
Запрос:
...
| stats max(currency), min(currency), max(sum), min(sum) by dest
| rename max(currency) as "most frequent currency", min(currency) as "rarest currency", max(sum) as "maximum amount", min(sum) as "minimum amount"
| append [| ... | top dest | rename count as "top dest"]
Результат:
dest | most frequent currency | rarest currency | maximum amount | minimum amount | top dest | percent |
---|---|---|---|---|---|---|
USA | USD | USD | 3 | 3 | ||
Germany | EUR | EUR | 21 | 19 | ||
Russia | RUB | EUR | 10 | 7 | ||
Russia | 3 | 50 | ||||
Germany | 2 | 33.333333333333336 | ||||
USA | 1 | 16.666666666666668 |
APPENDCOLS
Команда добавляет результаты подзапроса, как новые поля текущего запроса.
Синтаксис команды
appendcols <subsearch>
Обязательный параметр:
- subsearch — подзапрос, результаты выполнения которого будут добавлены в основной запрос.
Примеры использования
Пример 1
Дополняет информацию о работе аэропорта метеорологическими сводками.
Запрос:
| serach index=LA_Air
| appendcols subsearch=[search index=weather]
Пример 2
Дополняет данные о транзакциях информацией о курсе валют:
Исходные данные:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD | Russia | 7 |
1587045130 | EUR | Germany | 21 |
1587045140 | EUR | USA | 3 |
1587045150 | RUB | Germany | 19 |
1587045160 | EUR | Russia | 7 |
datetime | USD exchange | EUR exchange |
---|---|---|
1587045110 | 77,28 | 83,63 |
Запрос:
| otstats index=transactions
| appendcols [otstats index=currencies]
Результат:
datetime | currency | dest | sum | USD exchange | EUR exchange |
---|---|---|---|---|---|
1587045110 | RUB | Russia | 10 | 77,28 | 83,63 |
1587045120 | USD | Russia | 7 | ||
1587045130 | EUR | Germany | 21 | ||
1587045140 | EUR | USA | 3 | ||
1587045150 | RUB | Germany | 19 | ||
1587045160 | EUR | Russia | 7 |
Пример 3
Подсчитывает сколько раз встречается определённое поле в логах сервера и использует это значение для вычисления других полей.
...
| stats dc(userID) as totalUsers
| appendcols [ ... AND "text" | addinfo | where _time >= info_min_time AND _time <=info_max_time | stats count(field) as variableA ]
| eval variableB = (variableA/totalUsers)
Сначала в запросе используется команда stats для подсчета количества отдельных пользователей на сервере, это значение присваивается полю totalUsers.
Затем используется команда appendcols для добавления информации о том, сколько раз за определённое время встречается интересующее нас поле – variableA.
В конце подсчитываем новое поле variableB на основе полученных данных.
APPENDPIPE
Команда добавляет дополнительные преобразования (subpipeline) к результатам основного запроса. В отличие от подзапроса (subsearch), subpipeline не запускается первым. Subpipeline запускается тогда, когда запрос достигает команды appendpipe.
Синтаксис команды
appendpipe <subpipeline>
Обязательный параметр:
- subpipeline – список преобразований, которые применяются к результатам выполнения основного запроса.
Примеры использования
Пример 1
Считает сумму прилётов за день во все терминалы аэропорта.
Исходные данные:
Terminal | Date | Arrivals | Departures |
---|---|---|---|
TerminalA | 27.03.2019 | 235 | 321 |
TerminalB | 27.03.2019 | 178 | 167 |
TerminalC | 27.03.2019 | 79 | 68 |
TerminalA | 28.03.2019 | 216 | 278 |
TerminalB | 28.03.2019 | 165 | 145 |
TerminalC | 28.03.2019 | 64 | 60 |
TerminalA | 29.03.2019 | 223 | 216 |
TerminalB | 29.03.2019 | 143 | 120 |
TerminalC | 29.03.2019 | 87 | 98 |
Запрос:
...
| chart sum(Arrivals) by Terminal over Date
| appendpipe [| eval SUM=TerminalA+TerminalB+TerminalC]
Результат:
Date | TerminalA | TerminalB | TerminalC | SUM |
---|---|---|---|---|
27.03.2019 | 235 | 178 | 79 | 492 |
28.03.2019 | 216 | 165 | 64 | 453 |
29.03.2019 | 223 | 143 | 87 | 445 |
BIN
Команда отображает числовые значения поля в дискретный набор значений таким образом, что все значения из заданного диапазона значений этого же поля принимают одно из значений дискретного ряда.
Синтаксис команды
bin [<bin-options>...] <field> [AS <newfield>]
Обязательный параметр:
- field – поле, к которому будет применяться дискретизация.
Опциональные параметры:
-
bin-options — опции команды bin:
-
bins – устанавливает максимальное число фрагментов отображения (дискретизации).
-
span – устанавливает размер каждого фрагмента отображения (дискретизации) в единицах времени. Параметр применим только к полю _time.
-
-
AS <newfield> – имя нового поля, в которое будет записано значение после операции отображения (дискретизации).
Примеры использования
Пример 1
Делит весь диапазон значений поля location_id на 10 частей. Записывает результат в поле location_id_range. Считает количество уникальных пользователей в каждом из диапазонов значений поля id.
Исходные данные:
location_id | user |
---|---|
5 | John |
18 | Mary |
... | ... |
54 | Sam |
... | ... |
99 | Bob |
16 | Phil |
Запрос:
...
| bin bins=10 location_id as location_id_range
| stats dc(user) by location_id_range
Результат:
location_id_range | dc(user) |
---|---|
0-10 | 6 |
11-20 | 11 |
... | ... |
... | ... |
90-99 | 3 |
Пример 2
Исходные данные:
Для каждого хоста возвращает значение пропускной способности (throughput), усредненное по минутным интервалам времени.
_time | host | throughput |
---|---|---|
2019-10-02 12:20:00 | host1 | 13 |
2019-10-02 12:20:33 | host2 | 14 |
2019-10-02 12:20:55 | host2 | 2 |
2019-10-02 12:21:03 | host1 | 25 |
2019-10-02 12:21:34 | host2 | 2 |
2019-10-02 12:21:45 | host1 | 23 |
2019-10-02 12:21:55 | host2 | 18 |
2019-10-02 12:22:07 | host2 | 9 |
2019-10-02 12:22:08 | host1 | 11 |
Запрос:
...
| bin _time span=1m
| stats avg(throughput) by _time host
Результат:
_time | host | avg(throughput) |
---|---|---|
2019-10-02 12:20:00 | host1 | 13 |
2019-10-02 12:20:00 | host2 | 8 |
2019-10-02 12:21:00 | host1 | 24 |
2019-10-02 12:21:00 | host2 | 10 |
2019-10-02 12:22:00 | host1 | 11 |
2019-10-02 12:22:00 | host2 | 9 |
CHART
Команда chart группирует записи по указанному полю и является трансформирующей командой, которая возвращает результаты в табличном формате.
Результат, затем, может быть визуализирован в разных форматах – линейный график, столбчатая диаграмма, круговая диаграмма.
В команде chart должна быть определена статистическая функция для агрегации данных.
Синтаксис команды
chart <stats-agg-term> [OVER <row-split>] [BY <column-split>]
Обязательный параметр:
-
stats-agg-term – статистические функции, применяемые к полям и eval-выражениям. Результат выполнения функции может быть помещён в отдельное поле с именем, указанным после операнда AS.
Синтаксис: <stats-func>( <evaled-field> | <wc-field> ) [AS <new-field>].
Перечень функций представлен в разделе ниже.
Опциональные параметры:
-
OVER <row-split> – поле, определенное после OVER, появится в первой колонке результирующей таблицы. Значения полей в исходных данных станут значениями рядов в результирующей таблице. Если далее строить график по этой таблице, то эти поля будут отмечены на оси Х.
-
BY <column-split> – одно или несколько полей, значения которых будут названиями столбцов в результирующей таблице.
Статистические функции
Функции позволяют получить различные статистики по полю или eval-выражению, к которому они применяются.
В таблице представлен перечень функций, сгруппированных по типам:
Имя функции | Описание функции |
---|---|
Агрегирующие функции: | |
approxdc() | Приблизительное количество уникальных значений. |
avg() | Среднее арифметическое. |
count() | Количество значений. |
distinct_count() | Количество уникальных значений. |
max() | Наибольшее значение. |
min() | Наименьшее значение. |
perc() | Процентиль. |
percentile_approx() | |
stdev() | Стандартное отклонение. |
sum() | Сумма значений. |
var() | Дисперсия. |
Порядковые функции: | |
first() | Первое значение в таблице. |
last() | Последнее значение в таблице. |
Функции для работы с multivalue-полями: | |
list() | Список значений. |
values() | |
Временные функции: | |
earliest() | Первое значение в таблице. |
latest() | Последнее значение в таблице. |
Примеры использования
Исходные данные:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD | Russia | 7 |
1587045130 | EUR | Germany | 21 |
1587045140 | EUR | USA | 3 |
1587045150 | RUB | Germany | 19 |
1587045160 | EUR | Russia | 7 |
Пример 1
Считает сумму переводов и вычисляет максимальный перевод в разрезе по стране.
Запрос:
...| chart sum(sum) as total max(sum) as max_sent by dest_country
Результат выполнения:
dest_country | tolal | max_sent |
---|---|---|
Germany | 40 | 21 |
Russia | 34 | 17 |
USA | 3 | 3 |
Пример 2
Считает сумму переводов в разрезе по стране и в разрезе валюты перевода. Over отвечает за row-split, by отвечает за column-split.
Запрос:
... | chart sum(sum) over dest_country by currency
Результат:
dest_country | EUR | RUB | USD |
---|---|---|---|
Germany | 21 | 19 | |
Russia | 17 | 10 | 7 |
USA | 3 |
COLLECT
Команда сохраняет результаты запроса в указанном индексе.
Синтаксис команды
collect index=<string> [host=<host> source=<source> sourcetype=<sourcetype>]
Обязательные параметры:
- index=<string> – имя индекса, в который добавляются события.
Опциональные параметры:
-
host=<host> – имя хоста, указываемое для событий.
-
source=<source> – имя источника, указываемое для событий.
-
sourcetype=<sourcetype> – имя типа источника, указываемое для событий.
Примеры использования
Пример 1
Сохраняет отформатированные данные о транзакциях в новый индекс с указанием имени и типа источника.
Исходные данные:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD | Russia | 7 |
1587045130 | EUR | Germany | 21 |
1587045140 | EUR | USA | 3 |
1587045150 | RUB | Germany | 19 |
1587045160 | EUR | Russia | 7 |
Запрос:
| otstats index=transactions
| where dest="Russia"
| collect index=transactions_russia source=transactions sourcetype=transactions
COMMAND
Команда позволяет использовать функции Spark для обработки полей.
Синтаксис команды
command <field>=[<spark_function>(<field>, <options>)]
Обязательный параметр:
- field – имя поля, которому присваивается полученное значение.
Опциональный параметр:
-
spark_function – функция Spark.
Полный список доступных функций см. в документации на Spark.
Примеры использования
Исходные данные:
id | phrase |
---|---|
1 | world is never be the same |
2 | be quick or be dad |
3 |
Пример 1
Переводим все буквы поля phrase в верхний регистр.
Запрос:
... | command up_phrase=ucase(phrase)
Результат:
id | phrase | up_phrase |
---|---|---|
1 | world is never be the same | WORLD IS NEVER BE THE SAME |
2 | be quick or be dad | BE QUICK OR BE DAD |
3 |
Пример 2
Проверяем поля на пустые значения. Если поле пустое (значение = NULL), то новому полю будет присвоен 0, если поле не пустое – 1.
... | command empty_check=isnotnull(phrase)
Результат:
id | phrase | empty_check |
---|---|---|
1 | world is never be the same | 1 |
2 | be quick or be dad | 1 |
3 | 0 |
Пример 3
Присваивает полю position номер позиции слова "be" во фразе поля phrase (при этом просит начать поиск от 4-го символа).
Запрос:
... | command position=locate("be", phrase, 4)
Результат:
id | phrase | position |
---|---|---|
1 | world is never be the same | 16 |
2 | be quick or be dad | 13 |
3 |
CONVERT
Команда конвертирует значения поля в поисковом результате в числовые значения там, где это возможно.
Синтаксис команды
convert [timeformat=<string>] (<convert-function> [AS <field>])
Обязательный параметр:
-
convert-function – функция конвертирования:
ctime() – функция конвертирует время, представленное в Epoch-формате, в понятный для человека формат. При этом используются опции параметра timeformat, который описывает параметры конвертирования.
Опциональные параметры:
-
timeformat=<string> – описывает формат конвертирования поля. Формат времени по умолчанию: %Y-%m-%d %H:%M:%S.
-
AS <field> – имя нового поля, в которое будет записан результат конвертирования. Если AS не использовать, оригинальные значения полей будут заменены новыми сконвертированными.
Примеры использования
Исходные данные:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD | Russia | 7 |
Пример 1
Конвертирует время из Epoch-формата в формат %Y-%m-%d и создает поле Т, куда записывается результат.
Запрос:
...| convert timeformat="%Y-%m-%d" ctime(datetime) as T
Результат:
datetime | currency | dest | sum | T |
---|---|---|---|---|
1587045110 | RUB | Russia | 10 | 2019-10-02 |
1587045120 | USD | Russia | 7 | 2019-10-02 |
DEDUP
Команда удаляет события, которые содержат повторяющееся значение поля или повторяющуюся идентичную комбинацию значений полей, заданных как параметры команды. Такая процедура называется дедупликацией.
Важно!
Порядок, в котором события будут поступать на обработку в команду
dedup*, определяется результатом выполнения предыдущих команд. При этом один
и тот же порядок событий не может быть гарантирован для разных запусков запроса.
В случае необходимости сохранения одного и того же порядка событий для разных запусков запроса, необходимо предусмотреть сортировку событий до их поступления на вход команды dedup. Для этого, например, можно использовать команду sort.*
Синтаксис команды
dedup <field-list> [sortby <sort-by-clause>]
Обязательный параметр:
- field-list – поле или перечень полей, по которым выполняется дедупликация.
Опциональный параметр:
-
sortby <sort-by-clause> – порядок сортировки результата дедупликации по заданному полю:
-
в порядке возрастания – при указании префикса '+' перед полем сортировки;
-
в порядке убывания – при указании префикса '-' перед полем сортировки.
-
Примеры использования
Исходные данные:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD | Russia | 7 |
1587045130 | EUR | Germany | 21 |
1587045140 | EUR | USA | 3 |
1587045150 | RUB | Germany | 19 |
1587045160 | EUR | Russia | 7 |
Пример 1
Удаляет события, которые содержат идентичное значение поля dest и результат сортирует по полю sum в порядке возрастания.
Запрос:
... | dedup dest sortby +sum
Результат:
datetime | currency | dest | sum |
---|---|---|---|
1587045140 | EUR | USA | 3 |
1587045110 | RUB | Russia | 10 |
1587045130 | EUR | Germany | 21 |
DELTA
Вычисляет разницу между соседними результатами, используя значение определенного числового поля. Для каждого события, где поле field является числом, команда delta вычисляет разницу в порядке поиска между значением поля для текущего события и значением поля для предыдущего события. Команда delta записывает эту разницу в newfield.
Важно!
Порядок, в котором события будут поступать на обработку в команду
delta, определяется результатами выполнения предыдущих команд. В случае
необходимости сохранения одного и того же порядка событий, необходимо
предусмотреть сортировку событий внутри запроса (использование команды
sort).
Синтаксис команды
delta (<field> [AS <newfield>]) [p=<int>]
Обязательный параметр:
- field – имя поля для анализа.
Опциональные параметры:
-
AS <newfield> – псевдоним для нового поля, в которое будет записана вычисляемая разница (дельта).
-
p=<int> – определяет значение какого результата перед текущим использовать для сравнения:
-
p = 1 (по умолчанию), текущее значение результата сравнивается со значением в первом результате до текущего результата;
-
p = 2, текущее значение результата сравнивается со значением во втором результате до текущего результата;
и так далее.
-
Примеры использования
Пример 1
Считает изменение объёма авиатрафика.
Исходные данные:
Date | Departures |
---|---|
21.03.2019 | 150 |
22.03.2019 | 160 |
23.03.2019 | 145 |
... | ... |
Запрос:
... | sort Date |delta Departures as Diff
Результат выполнения:
Date | Departures | Diff |
---|---|---|
21.03.2019 | 150 | 0 |
22.03.2019 | 160 | 10 |
23.03.2019 | 145 | -15 |
... | ... | ... |
Пример 2
Вычисляет дельту транзакций для определённой валюты.
Исходные данные:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD | Russia | 7 |
1587045130 | EUR | Germany | 21 |
1587045140 | EUR | USA | 3 |
1587045150 | RUB | Germany | 19 |
1587045160 | EUR | Russia | 7 |
Запрос:
...
| where currency="EUR"
| sort _time
| delta sum as delta_sum_eur
Результат:
datetime | currency | dest | sum | delta_sum_eur |
---|---|---|---|---|
1587045130 | EUR | Germany | 21 | 0 |
1587045140 | EUR | USA | 3 | -18 |
1587045160 | EUR | Russia | 7 | 4 |
EVAL
Команда eval вычисляет выражение и помещает полученное значение в поле результатов поиска:
-
По результатам работы команды eval вычисляется новое поле, которое добавляется в результаты поиска.
-
Если имя вычисляемого поля совпадает с именем поля, которое уже существует в результатах поиска, то результаты выражения eval перезаписывают значения в существующем поле.
-
Результатом выражения eval не может быть логическое значение.
-
Если во время поиска выражение не может быть успешно вычислено для данного события, команда eval стирает результирующее поле и значением поля становится 'NULL'.
-
Если выражение ссылается на поле, имя которого содержит специальные символы, за исключением символа подчеркивания (_), то имя поля должно быть заключено в одинарные кавычки. Например, имя поля server-1 в выражении указывается так – new = count + 'server-1'.
-
Если имя вычисляемого поля содержит специальные символы, то могут использоваться как двойные, так и одинарные кавычки. Например, если имя поля – var-1, то обе записи – 'var-1' = m + n и "var-1" = m + n – будут обработаны корректно.
-
Если выражение ссылается на строку (string), то эта строка должна быть заключена в двойные кавычки. Например, если значение строки – server, то строка указывается как new = "server".
Команда eval оценивает математические, строковые и логические выражения.
Можно объединить несколько выражений в одном запросе, используя запятую для разделения последующих выражений.
Запрос обрабатывает несколько выражений eval слева направо и позволяет ссылаться в последующих выражениях на ранее преобразованные поля.
Синтаксис команды
eval <field>=<expression>["," <field>=<expression>]
Обязательный параметр:
-
<field>=<expression>:
-
field – имя поля назначения для результирующего вычисленного значения. Если имя поля уже существует в событиях, eval перезаписывает значение.
-
expression – комбинация значений, переменных, операторов и функций, которые будут выполнены, чтобы определить значение для размещения в поле назначения.
-
Операторы
В таблице перечислены основные операции, которые можно выполнить с помощью команды eval. Чтобы эти преобразования работали, значения должны быть подходящими для конкретного типа операции.
Тип операции | Операторы |
---|---|
Арифметический | + - * / % |
Логический | AND OR NOT XOR < > <= >= != = == LIKE |
Операторы операций над числами:
-
Оператор плюс (+) принимает два числа для сложения или две строки для объединения.
-
Операторы вычитания (-), умножения (*), деления (/) и вычисления остатка от деления (%) принимают два числа.
Операторы логических выражений:
-
Операторы AND и OR принимают два логических значения.
-
Операторы <, >, <=, >=,!=, =, == принимают два числа или две строки.
-
В выражениях одинарный знак равенства (=) является синонимом двойного знака равенства (==).
-
Оператор LIKE принимает две строки. Это сопоставление с образцом, аналогичное тому, что используется в SQL. Например, строка как шаблон. Оператор шаблона поддерживает литеральный текст, символ процента (%) для подстановочного знака и символ подчеркивания () для совпадения одного символа. Например, поле LIKE "a% b" соответствует любой строке, начинающейся с a, за которой следует что угодно, затем b, за которым следует один символ.
Имена полей
Чтобы указать имя поля из нескольких слов, можно объединить слова или использовать кавычки при указании имени. Например, чтобы указать имя поля Account ID, можно указать AccountID или "Account ID".
Чтобы указать имя поля со специальными символами, такими как точка, можно использовать кавычки. Например, чтобы указать имя поля www.domain, используйте "www.domain".
Поддерживаемые функции
Вместе с командой eval можно использовать широкий спектр функций. В таблице перечислены поддерживаемые функции, разделённые по типу:
Тип функции | Поддерживаемые функции |
---|---|
Сравнительные и условные функции | case(X,"Y",...), coalesce(X,...), if(X,Y,Z), like(TEXT,PATTERN), match(SUBJECT,"REGEX"), nullif(X,Y), true() |
Функции конвертации | printf, tonumber(NUMSTR,BASE), tostring(X,Y) |
Криптографические функции | md5(X), sha1(X) |
Функции даты и времени | now(), relative_time(X,Y), strptime(X,Y) |
Информационные функции | isnotnull(X), isnull(X) |
Математические функции | abs(X), ceiling(X)или ceil(X), exp(X), floor(X), ln(X), log(X,Y), pi(), pow(X,Y), round(X,Y), sqrt(X) |
Функции преобразования для мультизначений | mvappend(X,...), mvcount(MVFIELD), mvdedup(X), mvfind(MVFIELD,"REGEX"), mvindex(MVFIELD,STARTINDEX,ENDINDEX), mvjoin(MVFIELD,STR), mvrange(X,Y,Z), mvsort(X), mvzip(X,Y,"Z"), split(X,"Y") |
Статистические функции | max(X,...), min(X,...) |
Текстовые функции | len(X), lower(X), replace(X,Y,Z), substr(X,Y,Z), upper(X) |
Тригонометрические и гиперболические функции | acos(X), asin(X), atan(X), atan2(Y,X), cos(X), hypot(X,Y), sin(X), tan(X) |
Примеры использования
Пример 1
Создаёт новое поле transaction, объединяя значения из трёх существующих полей.
Исходные данные:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD | Russia | 7 |
1587045130 | EUR | Germany | 21 |
1587045140 | EUR | USA | 3 |
1587045150 | RUB | Germany | 19 |
1587045160 | EUR | Russia | 7 |
Запрос:
... | eval transaction=sum+" "+currency+" "+dest
Результат:
datetime | currency | dest | sum | transaction |
---|---|---|---|---|
1587045110 | RUB | Russia | 10 | 10 RUB Russia |
1587045120 | USD | Russia | 7 | 7 USD Russia |
1587045130 | EUR | Germany | 21 | 21 EUR Germany |
1587045140 | EUR | USA | 3 | 3 EUR USA |
1587045150 | RUB | Germany | 19 | 19 RUB Germany |
1587045160 | EUR | Russia | 7 | 7 EUR Russia |
Пример 2
Преобразует значения поля currency в нижний регистр.
Исходные данные:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD | Russia | 7 |
1587045130 | EUR | Germany | 21 |
1587045140 | EUR | USA | 3 |
1587045150 | RUB | Germany | 19 |
1587045160 | EUR | Russia | 7 |
Запрос:
... | eval currency_low=lower(currency)
Результат:
datetime | currency | dest | sum | currency_low |
---|---|---|---|---|
1587045110 | RUB | Russia | 10 | rub |
1587045120 | USD | Russia | 7 | usd |
1587045130 | EUR | Germany | 21 | eur |
1587045140 | EUR | USA | 3 | eur |
1587045150 | RUB | Germany | 19 | rub |
1587045160 | EUR | Russia | 7 | eur |
Пример 3
Использует функцию if для оценки размера транзакций.
Исходные данные:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD | Russia | 7 |
1587045130 | EUR | Germany | 21 |
1587045140 | EUR | USA | 3 |
1587045150 | RUB | Germany | 19 |
1587045160 | EUR | Russia | 7 |
Запрос:
... | eval "Transaction size"=if(sum>15, "Large", "Small")
Результат:
datetime | currency | dest | sum | Transaction size |
---|---|---|---|---|
1587045110 | RUB | Russia | 10 | Small |
1587045120 | USD | Russia | 7 | Small |
1587045130 | EUR | Germany | 21 | Large |
1587045140 | EUR | USA | 3 | Small |
1587045150 | RUB | Germany | 19 | Large |
1587045160 | EUR | Russia | 7 | Small |
Пример 4
Присваивает категорию размеру авиатрафика в терминалах аэропорта в разрезе календарных суток.
Исходные данные:
Terminal | Date | Arrivals | Departures |
---|---|---|---|
TerminalA | 27.03.2019 | 235 | 321 |
TerminalB | 27.03.2019 | 178 | 167 |
TerminalC | 27.03.2019 | 79 | 68 |
TerminalA | 28.03.2019 | 116 | 178 |
TerminalB | 28.03.2019 | 265 | 245 |
TerminalC | 28.03.2019 | 64 | 60 |
TerminalA | 29.03.2019 | 223 | 216 |
TerminalB | 29.03.2019 | 98 | 101 |
TerminalC | 29.03.2019 | 187 | 198 |
Запрос:
...
| eval Air_traffic_size=case((Arrivals+Departures)<=200, "Small", (Arrivals+Departures)>100 AND (Arrivals+Departures)<=400, "Medium", (Arrivals+Departures)>400, "Large")
| chart values(Terminal) by Air_traffic_size over Date
В этом примере используется команда chart для представления категории размера трафика в разрезе дней.
Результат:
Date | Large | Medium | Small |
---|---|---|---|
27.03.2019 | TerminalA | TerminalB | TerminalC |
28.03.2019 | TerminalB | TerminalA | TerminalC |
29.03.2019 | TerminalA | TerminalC | TerminalB |
EVENTSTATS
Команда считает статистику из значений полей и сохраняет результат в новом поле. В статистике участвуют события, имеющие в своем составе поля, для которых должна быть посчитана статистика.
Синтаксис команды
eventstats <stats-agg-term> ... [<by-clause>]
Обязательный параметр:
-
stats-agg-term – статистические функции, применяемые к полям и eval-выражениям. Результат выполнения функции может быть помещён в отдельное поле с именем, указанным после операнда AS.
Синтаксис:
<stats-func>( <evaled-field> | <wc-field> ) [AS <new-field>]
Перечень функций представлен в разделе ниже.
Опциональный параметр:
-
by-clause – поле или несколько полей, по которым надо рассчитать агрегацию (группировку).
Синтаксис:
by <field1> <field2> ....
Статистические функции
Функции позволяют получить различные статистики по полю или eval-выражению, к которому они применяются.
В таблице представлен перечень функций, сгруппированных по типам:
Имя функции | Описание функции |
---|---|
Агрегирующие функции: | |
approxdc() | Приблизительное количество уникальных значений. |
avg() | Среднее арифметическое. |
count() | Количество значений. |
distinct_count() | Количество уникальных значений. |
max() | Наибольшее значение. |
min() | Наименьшее значение. |
perc() | Процентиль. |
percentile_approx() | |
stdev() | Стандартное отклонение. |
sum() | Сумма значений. |
var() | Дисперсия. |
Порядковые функции: | |
first() | Первое значение в таблице. |
last() | Последнее значение в таблице. |
Функции для работы с multivalue-полями: | |
list() | Список значений. |
values() | |
Временные функции: | |
earliest() | Первое значение в таблице. |
latest() | Последнее значение в таблице. |
Примеры использования
Исходные данные:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD | Russia | 7 |
1587045130 | EUR | Germany | 21 |
1587045140 | EUR | USA | 3 |
1587045150 | RUB | Germany | 19 |
1587045160 | EUR | Russia | 7 |
Пример 1
Вычисляется максимальное и минимальное значение поля sum. В каждом событии создается два новых поля (maxsum и minsum), в которые записываются результаты вычислений.
Запрос:
... | eventstats max(sum) AS maxsum min(sum) AS minsum
Результат:
datetime | currency | dest | sum | maxsum | minsum |
---|---|---|---|---|---|
1587045110 | RUB | Russia | 10 | 21 | 3 |
1587045120 | USD | Russia | 7 | 21 | 3 |
1587045130 | EUR | Germany | 21 | 21 | 3 |
1587045140 | EUR | USA | 3 | 21 | 3 |
1587045150 | RUB | Germany | 19 | 21 | 3 |
1587045160 | EUR | Russia | 7 | 21 | 3 |
Пример 2
Вычисляется сумма поля sum в разбивке по странам. В каждое событие добавляется новое поле, содержащее сумму значений sum для каждой страны. Имя нового поля – sumTotal.
Запрос:
... | eventstats sum(sum) AS sumTotal by dest
Результат:
datetime | currency | dest | sum | sumTotal |
---|---|---|---|---|
1587045110 | RUB | Russia | 10 | 34 |
1587045120 | USD | Russia | 7 | 34 |
1587045130 | EUR | Germany | 21 | 40 |
1587045140 | EUR | USA | 3 | 3 |
1587045150 | RUB | Germany | 19 | 40 |
1587045160 | EUR | Russia | 7 | 34 |
FIELDS (TABLE)
Команда оставляет или удаляет выбранные поля из результатов запроса.
Если команда помещена в конец запроса, то на экран будут выведены указанные поля.
Если команда находится в середине запроса, то дальнейшая обработка данных будет происходить с полями, указанными после fields.
Если в запросе указаны поля, отсутствующие в наборе данных, то при использовании символа минус "-" они будут проигнорированы. А если символ минус не используется, то такие поля будут добавлены как пустые колонки.
Синоним команды – table.
Синтаксис команды
fields [-|*] <field-list>
Обязательный параметр:
-
field-list – список полей (через запятую), к которым должна быть применена команда fields. Также для указания полей с похожими именами можно использовать * (wildcard).
Синтаксис: <field1>, <field2>, ...
Опциональный параметр:
-
-|* – символ минус "-" или звездочка:
-
"-" – поля, указанные после этого символа, будут удалены из результатов запроса.
-
"*" – будут получены все поля.
-
Примеры использования
Исходные данные:
Name | Surname | age |
---|---|---|
John | Snow | 10 |
Alex | Smith | 7 |
Anna | Show | 21 |
Пример 1
Удалить из итоговой таблицы поле age.
Запрос:
... | fields – age
Результат:
Name | Surname |
---|---|
John | Snow |
Alex | Smith |
Anna | Show |
Пример 2
Вывести только поля Name и age.
... | fields Name, age
Результат:
Name | age |
---|---|
John | 10 |
Alex | 7 |
Anna | 21 |
FIELDSUMMARY
Команда вычисляет сводную статистику для всех полей в событиях. Сводная информация отображается в виде таблицы результатов.
Синтаксис команды
fieldsummary
Использование команды
Команда fieldsummary отображает сводную информацию в таблице результатов:
Сводное имя поля | Описание поля |
---|---|
column | Имя поля в событии. |
count | Количество событий с этим полем. |
max | Максимальное значение поля. |
mean | Среднее значение поля. |
min | Минимальное значение поля. |
stdev | Стандартное отклонение значений поля. |
Примеры использования
Пример 1
Вывести суммарную информацию из транзакций по определённой валюте.
Исходные данные:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD | Russia | 7 |
1587045130 | EUR | Germany | 21 |
1587045140 | EUR | USA | 3 |
1587045150 | RUB | Germany | 19 |
1587045160 | EUR | Russia | 7 |
Запрос:
...
| where currency="EUR"
| table sum
| fieldsummary
Результат:
column | count | max | mean | min | stddev |
---|---|---|---|---|---|
sum | 3 | 21 | 10.333333333333334 | 3 | 9.451631252505216 |
FILLDOWN
Если значение поля NULL, то команда filldown заполняет поле ближайшим сверху значением этого же поля, не равным NULL. Если у поля не было предыдущих не-NULL значений, то после применения filldown поле остаётся пустым (NULL).
Если список полей не объявлен, то команда filldown пытается отработать на всех полях или автоматически определить поля, содержащие значения NULL, и отработать на них.
Синтаксис команды
filldown [<wc-field-list> [defineTargetColumns=<bool>][BY <field-group>]]
Опциональные параметры:
-
wc-field-list – разделённые запятой имена полей, к которым будет применена команда filldown. Синтаксис: <field1>, <field2>, ...
-
defineTargetColumns – логический параметр, используемый при отсутствии параметра wc-field-list:
-
если defineTargetColumns=true, целевые поля (содержащие значения NULL) определятся во время выполнения команды;
-
если defineTargetColumns=false, команда filldown попытается отработать на всех полях.
Значение по умолчанию: false.
Важно!
Если параметр wc-field-list определён, параметр defineTargetColumns игнорируется.
-
-
BY <field-group> – поле, по которому в таблице будет выполнена группировка для дальнейшего заполнения NULL-значений полей, указанных в параметре wc-field-list, отдельно по каждой группе.
Важно!
При использовании параметра BY <field-group> должен быть определён параметр wc-field-list.
Примеры использования
Исходные данные:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045111 | RUB | ||
1587045120 | USD | USA | 20 |
1587045121 | USD | ||
1587045121 | EUR | ||
1587045111 | RUB | Russia | |
1587045121 | EUR | Italy | 40 |
1587045111 | RUB | Russia | 30 |
1587045122 | RUB | ||
1587045122 | EUR |
Пример 1
Если значение любого поля есть NULL, то оно заполняется ближайшим сверху не-NULL значением этого же поля.
Запрос:
... | filldown
Результат:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045111 | RUB | Russia | 10 |
1587045120 | USD | USA | 20 |
1587045121 | USD | USA | 20 |
1587045121 | EUR | USA | 20 |
1587045111 | RUB | Russia | 20 |
1587045121 | EUR | Italy | 40 |
1587045111 | RUB | Russia | 30 |
1587045122 | RUB | Russia | 30 |
1587045122 | EUR | Russia | 30 |
Пример 2
Если значение поля dest есть NULL, то оно заполняется ближайшим сверху не-NULL значением поля dest.
Запрос:
... | filldown dest
Результат:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045111 | RUB | Russia | |
1587045120 | USD | USA | 20 |
1587045121 | USD | USA | |
1587045121 | EUR | USA | |
1587045111 | RUB | Russia | |
1587045121 | EUR | Italy | 40 |
1587045111 | RUB | Russia | 30 |
1587045122 | RUB | Russia | |
1587045122 | EUR | Russia |
Пример 3
Если значение определённого в параметре <wc-field-list> поля есть NULL, и в команде присутствует параметр BY <field-group>, то оно заполняется ближайшим сверху не-NULL значением этого же поля в пределах категории, определённой значением параметра BY <field-group>.
Запрос:
... | filldown dest by currency
Результат:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045111 | RUB | Russia | |
1587045120 | USD | USA | 20 |
1587045121 | USD | USA | |
1587045121 | EUR | ||
1587045111 | RUB | Russia | |
1587045121 | EUR | Italy | 40 |
1587045111 | RUB | Russia | 30 |
1587045122 | RUB | Russia | |
1587045122 | EUR | Italy |
Пример 4
Если требуется заменить NULL-значения в тех полях таблицы, где значения могут быть NULL, и в команде присутствует параметр BY <field-group>, то следует явно указать эти поля.
Запрос:
... | filldown datetime, dest, sum by currency
Результат:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045111 | RUB | Russia | 10 |
1587045120 | USD | USA | 20 |
1587045121 | USD | USA | 20 |
1587045121 | EUR | ||
1587045111 | RUB | Russia | 10 |
1587045121 | EUR | Italy | 40 |
1587045111 | RUB | Russia | 30 |
1587045122 | RUB | Russia | 30 |
1587045122 | EUR | Italy | 40 |
FILLNULL
Если значение поля отсутствует, то есть равно NULL, то оно заполняется заданным в качестве аргумента значением. Если не определить конкретное значение для автозаполнения NULL-поля, то оно будет заполнено нулем (0). Если не определить список имен полей, NULL-значения которых должны быть автоматически заполнены, то будут заполнены все NULL-значения всех полей.
Синтаксис команды
fillnull [value=<string>] [<field-list>]
Опциональные параметры:
-
field-list – одно или несколько полей, разделенных пробелами. Если параметр не задан, то команда fillnull применяется ко всем полям. Синтаксис: <string> <string> ...
-
value=<string> – определяет, чем будут заполнены NULL-значения. Значение по умолчанию – 0.
Примеры использования
Исходные данные:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD |
Пример 1
Если значение любого поля есть NULL, то оно заполняется значением "no_value".
Запрос:
... | fillnull value="no_value"
Результат:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD | no_value | no_value |
Пример 2
Если значение поля sum есть NULL, то оно заполняется значением по умолчанию то есть 0. Null-значения остальных полей остаются неизменными.
... | fillnull sum
Результат:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD | 0 |
FOREACH
Команда запускает шаблонный поисковый запрос для каждого поля, к которому есть обращение через wildcard-конструкции в синтаксисе команды.
Синтаксис команды
foreach <wc-field>... <subsearch>
Обязательные параметры:
-
wc-field – список имен полей, к которым будет применяться шаблонный поисковый запрос. Можно использовать wildcard-конструкции при задании полей. Синтаксис: <field1> <field2>...
-
subsearch – поисковый запрос-шаблон, который будет применяться к полям wc-field, заменяя wildcard поля конкретными значениями. Синтаксис: [ subsearch ].
В тексте шаблонного запроса допускается использование следующих wildcard-конструкций:
-
<<FIELD>> – токен <<FIELD>> будет заменен именем поля целиком.
-
<<MATCHSTR>> – токен <<MATCHSTR>> будет заменен частью имени поля, которая определяется wildcard-правилами.
Примеры использования
Исходные данные:
currency | dest | sum |
---|---|---|
RUB | Russia | 10 |
USD | USA | 20 |
Пример 1
Создает поле newfield в каждой строке результата. В каждой строке поле newfield определяется как сумма фиксированной части newfield, равной 5, и текущего значения полей sum (сложение работает как сложение чисел) и currency (сложение работает как строковая операция).
Запрос:
...
| eval newfield=5, sum=tonumber(sum)
| foreach sum, currency [eval newfield = newfield+'<<FIELD>>']
Результат:
currency | dest | sum | newfield |
---|---|---|---|
RUB | Russia | 10 | 15.0RUB |
USD | USA | 20 | 25.0USA |
Пример 2
Создает поле newfield в каждой строке результата.
Создает поле newfield в каждой строке результата. В каждой строке поле newfield определяется как сложение следующих полей: поля, совпадающего с полем currency (подходит по wildcard = cu*cy), и фиксированной части "currency". Сложение работает как строковая операция.
Запрос:
...
|eval newfield=""
| foreach cu*cy [eval newfield = newfield + '<<FIELD>>' + "_currency"]
Результат:
currency | dest | sum | newfield |
---|---|---|---|
RUB | Russia | 10 | RUS_currency |
USD | USA | 20 | USA_currency |
HEAD
Команда возвращает первые N результатов поиска. Отсчет результатов будет вестись в порядке поиска, то есть, в том порядке, в котором события поступают на вход команды head после обработки предыдущими командами.
Важно!
Порядок, в котором события будут поступать на обработку в команду head,
определяется результатом выполнения предыдущих команд. Иногда один и тот же
порядок событий не может быть гарантирован для разных запусков запроса. В случае
необходимости сохранения одинакового порядка событий для разных запусков
запроса, необходимо предусмотреть сортировку событий до их поступления на вход
команды head. Для этого можно использовать команду sort.
Синтаксис команды
head [<N>] | [limit=<int>]
Опциональные параметры:
-
N – целое число, определяющее количество возвращаемых результатов.
-
limit=<int> – другой вариант задания количества возвращаемых результатов. Если значение возвращаемых результатов не задано, то head возвращает 10 результатов.
Примеры использования
Исходные данные:
currency | dest | sum |
---|---|---|
RUB | Russia | 10 |
USD | USA | 20 |
Пример 1
Возвращает первый результат из полученных до выполнения команды head.
Запрос:
... | head 1
Результат:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
INPUTLOOKUP
Команда inputlookup используется для вывода содержимого lookup-таблицы и поиска по ней. Lookup-таблица это файл в CSV-формате.
Важно!
Эту команду не рекомендуется применять при поиске по датам и времени. Для получения корректного результата поиска по датам и времени используйте команды otstats и search.
Синтаксис команды
inputlookup [append=<bool>] <filename> [WHERE <search-query>]
Обязательный параметр:
- filename – имя lookup-файла. Lookup-файл может не иметь расширения .csv, но должен быть в формате CSV.
Опциональные параметры:
-
append=<bool>:
-
если append=true, то данные lookup-файла будут присоединены к результатам, полученным до вызова команды inputlookup.
-
если append=false (значение по умолчанию), то содержимое lookup-файла заменит результаты, полученные до вызова команды inputlookup.
-
-
WHERE <search-query> – опция для предварительной фильтрации данных lookup-файла. Результатом поискового запроса будут только те строки lookup-файла, которые попадут под условия фильтрации.
Поддерживается следующий набор операторов: =, !=, <, >, <=, >=, AND, OR, NOT.
Примеры использования
Исходные данные:
lookup-файл money_senders.csv со следующим содержимым:
dest_country | sender | sum |
---|---|---|
RUS | John | 20 |
USA | Mary | 10 |
Пример 1
Выводит содержимое lookup-файла money_senders.csv.
Запрос:
...| inputlookup money_senders.csv
Результат выполнения:
dest_country | sender | sum |
---|---|---|
RUS | John | 20 |
USA | Mary | 10 |
Пример 2
Присоединяет содержимое lookup-файла money_senders.csv к результатам поискового запроса до вызова команды inputlookup.
Запрос:
| makeresults
| eval dest_country="France", sender="Tom",sum=99
| inputlookup append=t money_senders.csv
Результат:
dest_country | sender | sum |
---|---|---|
France | Tom | 99 |
RUS | John | 20 |
USA | Mary | 10 |
Пример 3
Выводит только те строки lookup-файла, в которых поле sum строго больше 10.
Запрос:
... | inputlookup append=t money_senders.csv where sum>10
Результат:
dest_country | sender | sum |
---|---|---|
RUS | John | 20 |
JOIN
Команда join комбинирует результаты поискового подзапроса с результатами основного запроса. Основной запрос и подзапрос должны содержать в себе одно или несколько идентичных полей.
Альтернативные команды. Если для решения задачи не требуется в точности семантика join, то использование схожих по функционалу команд может быть более целесообразно: append, appendcols, lookup, search, stats.
Синтаксис команды
join [join-options...] [<field-list>] <subsearch>
Обязательный параметр:
- subsearch – возвращающий результаты поисковый подзапрос, к которому будут присоединены результаты основного запроса.
Опциональные параметры:
-
join-options – опции команды join.
Синтаксис: type=(inner | outer | left | right) | max=<int>.
Описание:
-
type – тип команды join.
Синтаксис: type=inner | outer | left | right.
Значение по умолчанию: left.
Разница между типами заключается в том, каким образом обрабатываются события основного запроса, которые не могут быть поставлены в соответствие событиям поискового подзапроса. Как в inner так и в left возвращаются только те события, которые могут быть поставлены в соответствие друг другу по заданному полю. Однако результаты inner join не включают события основного запроса, которые не имеют совпадений в подзапросе. Результат же left join (или outer join) включает все события основного запроса и те события из подзапроса, которые могут быть поставлены в соответствие событиям основного запроса по заданному полю.
См. примеры 3, 4, 5.
-
max – максимальное возвращаемое количество результатов поискового подзапроса, с которым будет объединён каждый результат основного запроса. Параметр, равный нулю (0), означает, что ограничений на количество результатов нет.
Значение по умолчанию: 0.
Синтаксис: max=<int>.
-
-
field-list – поля, по которым будет выполняться команда join. Совпадение значений полей основного запроса и подзапроса должно быть с точностью до регистра отдельных символов.
Синтаксис: <field1>, <field2>, ...
Примеры использования
Исходные данные:
Результат Запроса_1. Для удобства результат представлен в виде таблицы (search1.csv):
currency | dest_country | sum |
---|---|---|
EUR | Italy | 10 |
USD | Russia | 13 |
RUB | Canada | 14 |
EUR | Canada | 1 |
USD | Russia | 3 |
MXN | Mexico | 7 |
Результат Запроса_2. Для удобства результат представлен в виде таблицы (search2.csv):
commission | dest_country |
---|---|
1,7% | Canada |
3.3% | Italy |
2% | Russia |
2.1% | Georgia |
Пример 1
Соединяет результаты Запроса_1 с результатами Запроса_2 по полю dest_country.
Запрос:
...
| inputlookup search1.csv
| join dest_country [| inputlookup search2.csv]
Результат:
commission | currency | dest_country | sum |
---|---|---|---|
3.3% | EUR | Italy | 10 |
2% | USD | Russia | 13 |
7% | RUB | Canada | 14 |
7% | EUR | Canada | 1 |
2% | USD | Russia | 3 |
Пример 2
Соединяет результаты Запроса_2 с результатами Запроса_1 по полю dest_country. Видно, что каждому результату Запроса_2, который в примере является основным запросом, ставится в соответствие один результат Запроса_1 (используется опция max=1), который в примере является подзапросом. Если max=1 задан не будет, то ограничений по числу "соединений" полей не будет.
...
| inputlookup search2.csv
| join dest_country max=1 [| inputlookup search1.csv]
Результат:
commission | currency | dest_country | sum |
---|---|---|---|
2% | USD | Russia | 3 |
3.3% | EUR | Italy | 10 |
7% | EUR | Canada | 1 |
Пример 3
Пример операции join type=outer.
Результат:
commission | currency | dest_country | sum |
---|---|---|---|
3.3% | EUR | Italy | 10 |
3.4% | MXN | Mexico | 7 |
1.7% | RUB | Canada | 14 |
1.7% | EUR | Canada | 1 |
2% | USD | Russia | 13 |
2% | USD | Russia | 3 |
Пример 4
Пример операции join type=left.
Результат:
commission | currency | dest_country | sum |
---|---|---|---|
3.3% | EUR | Italy | 10 |
2% | USD | Russia | 13 |
1.7% | RUB | Canada | 14 |
1.7% | EUR | Canada | 1 |
2% | USD | Russia | 3 |
3.4% | MXN | Mexico | 7 |
Пример 5
Пример операции join type=inner.
Результат:
commission | currency | dest_country | sum |
---|---|---|---|
1.7% | EUR | Canada | 1 |
1.7% | RUB | Canada | 14 |
3.3% | EUR | Italy | 10 |
2% | USD | Russia | 3 |
2% | USD | Russia | 13 |
LOOKUP
Команда используется для добавления поля из существующей таблицы в результаты запроса. В качестве существующей таблицы обычно выступает таблица в CSV-формате, сохраненная в файловой системе.
Синтаксис команды
lookup <lookup-file> <field-list> [AS <new_field_name>]
Команда позволяет присоединять релевантные поля из существующей таблицы в результаты запроса при совпадении значений целевого поля или полей field-list со значением в результатах запроса.
Обязательные параметры:
-
lookup-file – имя файла таблицы, сохраненное в файловой системе, в директории ../lookups.
-
field-list – поле или список полей (через запятую), по которым осуществляется связка таблицы с результатами запроса.
Опциональный параметр:
- AS <new_field_name> – имя, используемое для переименования поля в существующей таблице, если целевое поле с ним не совпадает.
Примеры использования
Исходные данные:
Имеем существующую таблицу students.csv:
Name | Familyname | age |
---|---|---|
John | Snow | 10 |
John | Smith | 7 |
Anna | Show | 21 |
И результаты запроса, в которых поле с фамилиями указано как Surname:
Name | Surname | Town |
---|---|---|
John | Snow | Moscow |
John | Smith | Volgograd |
John | Bond | Perm |
Пример 1
Результаты запроса нам выдают имя и фамилию без возраста. Требуется добавить в результаты запроса возраст из сохраненной таблицы. Для этого обязательно указываем связующие столбцы таблицы Name и Familyname, причем Familyname нужно переименовать в Surname.
Запрос:
| lookup students.csv Name, Familyname as Surname
Результат:
Name | Familyname | Town | age |
---|---|---|---|
John | Snow | Moscow | 10 |
John | Smith | Volgograd | 7 |
John | Bond | Perm |
MAKEMV
Команда конвертирует поле, состоящее из одного значения (singlevalue-поле), в поле, состоящее из нескольких значений (multivalue-поле), разделяя singlevalue-поле на отдельные части указанным строковым разделителем.
Синтаксис команды
makemv [delim=<string>] <field>
Обязательный параметр:
- field – имя singlevalue-поля, которое будет преобразовано в multivalue-поле.
Опциональный параметр:
-
delim=<string> – строка, которая будет использована в качестве разделителя при преобразовании в multivalue-поле.
Значение по умолчанию: пробел (" ").
Примеры использования
Исходные данные:
dest_country | sender | sum |
---|---|---|
RUS | John OR Mary | 20 |
USA | John OR Mary | 10 |
Пример 1
Преобразует singlevalue-поле sender, в multivalue-поле c таким же именем. В качестве строки-разделителя используется "OR".
Запрос:
...| makemv sender delim="OR"
Результат выполнения:
dest_country | sender | sum |
---|---|---|
RUS | John Mary | 20 |
USA | John Mary | 10 |
MAKERESULTS
Команда создает (генерирует) требуемое количество результатов поиска. Если не указывать опциональные параметры, то команда генерирует только один результат с единственным полем _time.
Важно!
Эту команду не рекомендуется применять при поиске по датам и времени. Для получения корректного результата поиска по датам и времени пользуйтесь командами otstats и search.
Синтаксис команды
makeresults [count=<num>] [annotate=<bool>]
Обязательные параметры: отсутствуют.
Опциональные параметры:
-
count=<num> – количество результатов, которые должны быть сгенерированы. Значение по умолчанию: 1.
Если count не указан, то команда генерирует только один результат с единственным полем _time.
-
annotate=<bool>:
-
если annotate=true, то дополнительно будут сгенерированы результаты с полями, указанными в таблице ниже;
-
если annotate=false, то сгенерированные результаты будут содержать только поле _time. Значение по умолчанию: false.
-
Поля, генерируемые при указании annotate=true:
Поле | Значение |
---|---|
_raw | Нет значения (NULL) |
_time | Дата и время выполнения команды makeresults |
host | Нет значения (NULL) |
source | Нет значения (NULL) |
sourcetype | Нет значения (NULL) |
Примеры использования
Пример 1
Генерирует 3 результата. Дополняет результат полем dest_country со значением "Russia".
Запрос:
| makeresults count=3
| eval dest_country="Russia"
Результат:
_time | dest_country |
---|---|
1588755573 | Russia |
1588755573 | Russia |
1588755573 | Russia |
MVCOMBINE
Команда берет группу событий, которые отличаются только одним полем, содержащим определенное значение, и комбинирует их в одно событие. Значение в этом поле становится массивом значений из скомбинированных по этому полю значений.
Синтаксис команды
mvcombine <field>
Команда mvcombine принимает на вход события и находит группы событий, где все поля одинаковы в отличие от указанного после команды поля. Полученные значения этого поля объединяются в массив и становятся новым значением этого поля. Так как события могут содержать много разных полей (особенно часто различающиеся поля _time и _raw), то имеет смысл предварительно отобрать нужные поля с помощью команды fields.
Обязательный параметр:
- field – имя поля, значения которого будут комбинироваться.
Примеры использования
Исходные данные:
host | ping | latency |
---|---|---|
www1 | 10 | 1 |
www2 | 10 | 1 |
finance_dep | 11 | 1 |
it_dep | 11 | 2 |
www3 | 10 | 1 |
Пример 1
Комбинирует значения поля host там, где поля latency и ping содержат одинаковые значения (то есть 1 и 10).
Запрос:
... | mvcombine host
Результат:
host | ping | latency |
---|---|---|
www1 www2 www3 | 10 | 1 |
finance_dep | 11 | 1 |
it_dep | 11 | 2 |
MVEXPAND
Команда разворачивает значения многозначного поля в отдельные события. Для каждого результата команда создаёт новое событие.
Синтаксис команды
mvexpand <field> [limit=<int>]
Обязательный параметр:
- field – имя многозначного поля.
Опциональный параметр:
- limit=<int> – количество значений в многозначном поле field, которое будет использоваться для каждого входного события.
Примеры использования
Пример 1
В этом примере показано, как развернуть событие с многозначным полем в отдельные события для каждого значения поля.
Исходные данные:
Date | fields |
---|---|
27.04.2020 | 33,55 17,18 34,54 |
28.04.2020 | 3,5 34,34 67,9 |
Запрос:
...
| mvexpand fields
| rex field=fields "(?<alpha>\d+),(?<beta>\d+)"
| table _time alpha beta
Результат:
Date | alpha | beta |
---|---|---|
27.04.2020 | 33 | 55 |
27.04.2020 | 17 | 18 |
27.04.2020 | 34 | 54 |
28.04.2020 | 3 | 5 |
28.04.2020 | 34 | 34 |
28.04.2020 | 67 | 9 |
NOMV
Команда конвертирует значения multivalue-поля в singlevalue-поле.
Синтаксис команды
nomv <field>
Обязательный параметр:
- field – имя multivalue-поля, которое необходимо конвертировать в singlevalue-поле
Примеры использования
Исходные данные:
Поле dest является multivalue-полем.
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia France | 10 |
1587045120 | USD | Italy USA | 7 |
Пример 1
Создает singlevalue-поле dest из multivalue-поля dest. Поле dest становится обычной строкой.
Запрос:
... | nomv dest
Результат:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia France | 10 |
1587045120 | USD | Italy USA | 7 |
Теперь с полем dest можно проводить строковые операции, как с обычной строкой:
... | nomv dest | eval dest=dest+"Spain"
Результат:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia France Spain | 10 |
1587045120 | USD | Italy USA Spain | 7 |
OTLOADJOB
Команда извлекает из кеша результаты ранее выполненного запроса. Извлечение результата из кеша предполагает, что запрос не выполняется заново, а запрашиваются только его результаты.
Синтаксис команды
otloadjob <spl-query>
Обязательный параметр:
-
spl-query – поисковый запрос, результаты которого требуется извлечь из кэша. Успешное выполнение команды otloadjob возможно только при наличии двух условий:
-
Запрос, результат которого требуется получить, должен быть выполнен.
-
Время хранения результата выполненного запроса не истекло.
Если хотя бы одно из условий отсутствует, запрос, указанный в параметре spl-query, будет выполнен повторно.
Spl-запрос задается как строка. При этом, если внутри запроса встречаются кавычки, то они должны быть заэкранированы символом обратный слеш ("\").
Синтаксис: spl="spl-запрос".
-
Примеры использования
Исходные данные:
Выполнен запрос:
index="apache"
| stats count as num
Получен результат:
num |
---|
46 |
Пример 1
После выполнения запроса, указанного в исходных данных, выполнен следующий запрос:
| otloadjob spl="index=\"apache\"
| stats count as num"
Запрос выполнен до истечения времени хранения результата запроса, указанного в исходных данных.
Следовательно, в качестве результата будет возвращён результат запроса, указанного в исходных данных:
num |
---|
46 |
OTSTATS
Команда используется для получения из индекса данных с извлеченными во время индексации полями. Вы можете получить события из индексов, указывая необходимые поля и используя логические выражения. Также для получения более широкого поля результатов можно использовать wildcard (*).
Команда otstats также может быть использована в подзапросе. После того как данные получены из индекса, к ним можно применять различные команды трансформации, фильтрации и т.д. Отличие от команды search (которая читает и выводит только поля _time и _raw) заключается в том, что otstats читает из файловой системы уже проиндексированные поля, что ускоряет работу поиска, так как нет необходимости проводить дополнительный парсинг во время поискового запроса.
Синтаксис команды
otstats index=<index-name> [<logical-expression>] [<time>]
Для поиска по нескольким индексам и значениям полей можно использовать логические выражения (OR, AND). При чередовании через пробел нескольких индексов или полей к ним применяется логический оператор OR. Стоит отметить, что необходимо учитывать тип данных того поля, по которому производится поиск, так как к строковым значениям нельзя применить операции сравнения (<, >, >=, <=, !=). Знак вертикальной черты "|" перед командой не обязателен, так как она идет первой в запросе или подзапросе.
Обязательный параметр:
- index=<index-name> – имя индекса, из которого будут читаться данные. Имя индекса необходимо заключать в двойные кавычки.
Опциональные параметры:
-
logical-expression – логическое выражение. Выражение может содержать два и более вариантов поиска, соединенных логическими операторами, такими как OR или AND. Поиск по определенным значениям осуществляется с помощью знака равно "=" или "!=". Может быть использован также оператор регулярных выражений wildcard (в конце строки) и знаки сравнения (<, >, >=, <=, !=) для числовых значений.
-
time – в подзапросах (или основном запросе) могут использоваться дополнительные опции времени (latest= и earliest=) для поиска по другому временному интервалу. Временные рамки указываются в формате Epoch time (Linux time).
Примеры использования
Исходные данные:
Имеются два индекса с логами данных linux-log и nginx-log с полями _time, _raw, severity, message.
Пример 1
Выводим данные из индекса linux-log, где поле severity указывает на возникновение ошибки:
| otstats index="linux-log" severity="ERR*"
Пример 2
Выводим данные из индекса linux-log и nginx-log, где поле severity указывает на возникновение ошибки и на критическое событие:
| otstats index="linux-log" index="nginx-log" severity="ERR*" OR severity="CRITICAL"
Пример 3
Выводим данные из индекса linux-log и прибавляем к ним данные из подзапроса, указывая другой временной интервал:
| otstats index="linux-log" severity="ERR*"
| append [otstats index="nginx-log" earliest=1577836799 latest=1577858400]
OUTPUTLOOKUP
Команда сохраняет результаты запроса в статическую таблицу (lookup).
Синтаксис команды
outputlookup <filename> [append=<bool>]
Обязательный параметр:
- filename – имя lookup-файла.
Опциональный параметр:
-
append=<bool>:
-
если append=false (по умолчанию), то команда outputlookup перезаписывает данные в существующем lookup-файле;
-
если append=true, то outputlookup пытается добавить результаты запроса в существующий файл.
-
Примеры использования
Пример 1
Фильтрует список транзакций и сохраняет результаты запроса в lookup-файл.
Исходные данные:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD | Russia | 7 |
1587045130 | EUR | Germany | 21 |
1587045140 | EUR | USA | 3 |
1587045150 | RUB | Germany | 19 |
1587045160 | EUR | Russia | 7 |
Запрос:
...
| where currency="EUR"
| outputlookup transactions_eur.csv
Результат, записанный в lookup-файл:
datetime | currency | dest | sum |
---|---|---|---|
1587045130 | EUR | Germany | 21 |
1587045140 | EUR | USA | 3 |
1587045160 | EUR | Russia | 7 |
RANGEMAP
Команда разбивает значения числового поля на категории. Команда добавляет новое поле с именем range к каждому событию и отображает категорию в этом поле.
Значения в поле range основаны на указанных числовых диапазонах. Если значение в числовом поле не соответствует какому-либо из указанных диапазонов, поле range устанавливается в значение по умолчанию.
Синтаксис команды
rangemap field=<string> (<attribute_name>=<numeric_range>)... [default=<string>]
Обязательные параметры:
-
field=<string> – имя категоризируемого поля, содержащего числовые значения.
-
<attribute_name>=<numeric_range>:
-
attribute_name – строка, выводимая в поле range, когда значение в field попадает в диапазон значений из numeric_range.
-
numeric_range – начальное и конечное значения диапазона, заданные через слеш (-).
Значения могут быть целыми числами или числами с плавающей запятой. Первое значение должно быть меньше, чем второе.
-
Опциональный параметр:
- default=<string> – значение по умолчанию, которое выводится в случае, если категоризируемое поле не соответствует какому-либо из указанных диапазонов. По умолчанию значение – "None".
Примеры использования
Пример 1
Разбивает на категории события на основании значения поля суммы транзакции (sum).
Исходные данные:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD | Russia | 7 |
1587045130 | EUR | Germany | 21 |
1587045140 | EUR | USA | 3 |
1587045150 | RUB | Germany | 19 |
1587045160 | EUR | Russia | 7 |
Запрос:
... | rangemap field=sum min=1-5 med=6-15 max=16-30
Результат:
datetime | currency | dest | sum | range |
---|---|---|---|---|
1587045110 | RUB | Russia | 10 | med |
1587045120 | USD | Russia | 7 | med |
1587045130 | EUR | Germany | 21 | max |
1587045140 | EUR | USA | 3 | min |
1587045150 | RUB | Germany | 19 | max |
1587045160 | EUR | Russia | 7 | med |
Пример 2
Установите значение поля range в "зеленый", если date_second находится между 1-30, "жёлтый", если между 31-39, "красный", если между 40-59 и "серый", если диапазон не совпадает (например, если date_second = 0).
Запрос:
... | rangemap field=date_second green=1-30 yellow=31-39 red=40-59 default=gray
RARE
Команда находит наименее распространённые значения в выбранных полях.
Синтаксис команды
| rare [<limit>] <field-list> [<by-clause>]
Команда вычисляет количество и процентное соотношение того, насколько редко выбранные значения встречаются в событиях. Если добавлена опция by-clause, то результат будет сгруппирован по полю, указанному после by.
Обязательный параметр:
- field-list – поле или список полей (через запятую или пробел), по которым проводится подсчёт.
Опциональный параметр:
-
limit – количество нижних строк, которые должны быть выведены в результате. По умолчанию: 10.
-
by-clause – одно или несколько полей, значения которых будут названиями столбцов в результирующей таблице.
Пример использования
Выводит 3 наименее часто встречающихся имени.
Исходные данные:
Name | Surname | age |
---|---|---|
John | Snow | 10 |
Alex | Smith | 7 |
Anna | Show | 21 |
John | Bond | 3 |
John | Smith | 19 |
Tony | Stark | 5 |
John | Dow | 19 |
Tony | Pitt | 5 |
Запрос:
... | rare 2 Name
Результат:
Name | count | percent |
---|---|---|
Anna | 1 | 12,5 |
Tony | 2 | 25 |
RENAME
Команда переименовывает одно или несколько полей. Для переименования полей с похожими именами можно использовать подстановочный знак (*).
Синтаксис команды
rename <wc-field> AS <wc-field>...
Обязательный параметр:
- <wc-field> AS <wc-field> – название поля и через оператор AS имя для его замены. В именах полей можно использовать подстановочные знаки. Имена с пробелами должны быть заключены в кавычки.
Примеры использования
Пример 1
Переименовывает поле dest в поле destination country.
Исходные данные:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD | Russia | 7 |
1587045130 | EUR | Germany | 21 |
1587045140 | EUR | USA | 3 |
1587045150 | RUB | Germany | 19 |
1587045160 | EUR | Russia | 7 |
Запрос:
... | rename dest as "destination country"
Результат:
datetime | currency | destination country | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD | Russia | 7 |
1587045130 | EUR | Germany | 21 |
1587045140 | EUR | USA | 3 |
1587045150 | RUB | Germany | 19 |
1587045160 | EUR | Russia | 7 |
Пример 2
Переименовывает несколько полей с похожими именами, используя подстановочный знак (*).
Исходные данные:
Date | TerminalA | TerminalB | TerminalC |
---|---|---|---|
27.03.2019 | 235 | 178 | 79 |
28.03.2019 | 116 | 265 | 64 |
29.03.2019 | 223 | 98 | 187 |
Запрос:
... | rename Terminal* as "Terminal *"
Результат:
Date | Terminal A | Terminal B | Terminal C |
---|---|---|---|
27.03.2019 | 235 | 178 | 79 |
28.03.2019 | 116 | 265 | 64 |
29.03.2019 | 223 | 98 | 187 |
REPLACE
Команда заменяет значение поля указанным значением. Заменяет единственное вхождение первой строки другой строкой в указанном поле.
Синтаксис команды
replace (<wc-string> WITH <wc-string>)[IN <field>]
Обязательные параметры:
-
<wc-string> WITH <wc-string> – значение поля и значение для его замены, разделённые оператором WITH. Можно использовать символы подстановки для соответствия одному или нескольким значениям.
-
IN <field> – имя поля, в котором происходит замена значения. Чтобы заменить значения в поле field, необходимо указать имя поля с оператором IN.
Примеры использования
Пример 1
Заменяет сокращённое название валют на полное.
Исходные данные:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD | Russia | 7 |
1587045130 | EUR | Germany | 21 |
1587045140 | EUR | USA | 3 |
1587045150 | RUB | Germany | 19 |
1587045160 | EUR | Russia | 7 |
Запрос:
...
| replace EUR with Euro in currency
| replace RUB with Ruble in currency
| replace USD with Dollar in currency
Результат:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | Ruble | Russia | 10 |
1587045120 | Dollar | Russia | 7 |
1587045130 | Euro | Germany | 21 |
1587045140 | Euro | USA | 3 |
1587045150 | Ruble | Germany | 19 |
1587045160 | Euro | Russia | 7 |
RETURN
Команда используется в подзапросах, чтобы подставить в исходный запрос значение из определенной колонки полученного набора данных. Если при вычислении подзапроса будет получено более одной записи, то команда вернёт только первое значение из указанной колонки.
Команда возвращает значение из подзапроса в виде строки (не датафрейма). Это позволяет использовать команду в подзапросах для генерации сложных выражений, которые далее в основном запросе могут быть вычислены командой eval (команда eval принимает строковое выражение для вычисления поля).
Синтаксис команды
return $<column_name>
Обязательный параметр:
- $<column_name> – колонка, значения которой вернутся из подзапроса.
Опциональные параметры отсутствуют.
Пример использования
Исходные данные:
Набор представляет результаты измерений температуры на скважинах нескольких месторождений. На одно месторождение может приходиться несколько скважин.
_time | deposit | well | metric_name | value |
---|---|---|---|---|
16744164 | deposit_1 | well_1 | temperature | 27 |
16744164 | deposit_1 | well_2 | temperature | 24 |
16744164 | deposit_2 | well_1 | temperature | 27 |
16744164 | deposit_2 | well_2 | temperature | 25 |
16744164 | deposit_3 | well_1 | temperature | 27 |
16744164 | deposit_3 | well_1 | temperature | 26 |
16744364 | deposit_1 | well_1 | temperature | 26 |
16744364 | deposit_2 | well_2 | temperature | 25 |
16744364 | deposit_3 | well_2 | temperature | 27 |
16744364 | deposit_3 | well_2 | temperature | 22 |
Используем команду для возврата значения из подзапроса. Добавим к исходному набору данных новое поле логического типа, которое будет принимать значение true, если температура отклонилась от средней величины (по всем скважинам всех месторождений) более чем на 5%. При этом для вычисления средней температуры воспользуемся подзапросом.
В подзапросе для перечитывания исходного набора используется команда inputlookup (исходный набор представлен в виде csv-файла).
... | eval alarm=abs(value / [| inputlookup test.csv | eventstats avg(value) as avgTemp | return avgTemp] - 1) > 0.05
Результат:
_time | deposit | well | metric_name | value | alarm |
---|---|---|---|---|---|
1641744164 | deposit_1 | well_1 | temperature | 27 | true |
1641744164 | deposit_1 | well_2 | temperature | 24 | true |
1641744164 | deposit_2 | well_1 | temperature | 27 | true |
1641744164 | deposit_2 | well_2 | temperature | 25 | false |
1641744164 | deposit_3 | well_1 | temperature | 27 | true |
1641744164 | deposit_3 | well_1 | temperature | 26 | false |
1641744364 | deposit_1 | well_1 | temperature | 26 | false |
1641744364 | deposit_2 | well_2 | temperature | 25 | false |
1641744364 | deposit_3 | well_2 | temperature | 27 | true |
1641744364 | deposit_3 | well_2 | temperature | 22 | true |
REVERSE
Команда инвертирует порядок результатов.
Важно!
Порядок, в котором события будут поступать на обработку в команду
reverse, определяется результатом выполнения предыдущих команд. В случае
необходимости сохранения одинакового порядка событий для разных запусков
запроса, необходимо предусмотреть сортировку событий до их передачи на вход
команды reverse. Для этого можно использовать, например, команду
sort.
Синтаксис команды
reverse
Примеры использования
Исходные данные:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD | USA | 20 |
Пример 1
Инвертирует порядок строк в таблице.
Запрос:
... | reverse
Результат:
datetime | currency | dest | sum |
---|---|---|---|
1587045120 | USD | USA | 20 |
1587045110 | RUB | Russia | 10 |
REX
Команда позволяет находить совпадения в значениях полей согласно регулярным выражениям.
Синтаксис команды
rex (field=<field> <regex-expression> [max_match=<int>])
Команда позволяет выделять поля, используя именованные группы регулярных выражений.
Команда rex находит совпадения в строках указанного поля, согласно регулярному выражению, и выделяет его в отдельное поле с соответствующим именем (указанным в качестве группы именования регулярного выражения – ?<groupname>).
Запуск команды rex по отношению к полю _raw может сильно влиять на производительность.
Обязательные параметры:
-
field=<field> – поле, по которому осуществляется поиск.
-
regex-expression -– регулярное выражение, согласно которому производится поиск совпадений.
Опциональный параметр:
-
max_match=<int> – определяет максимальное количество совпадений, которые должны быть найдены в поле. По умолчанию: 1 (первое совпадение).
Если поле содержит multivalue-список, то совпадения будут определяться по каждому элементу списка в отдельности.
Примеры использования
Исходные данные:
time | phrase | mvword |
---|---|---|
2020 | world is never be the same | step stone moon |
2021 | be quick or be dad | rapid quick fast |
Пример 1
Создает новое multivalue поле first_word, которое содержит первое слово в фразе.
Запрос:
... | rex field=phrase "(?<first_word>^\w+)."
Результат:
time | phrase | mvword | first_word |
---|---|---|---|
2020 | world is never be the same | step stone moon | world |
2021 | be quick or be dad | rapid quick fast | be |
Пример 2
Создает новое поле, которое содержит последнюю букву каждого слова из multivalue-значений поля mvword.
Запрос:
... | rex field=mvword "(^\w+)(?<last_letter>\w$)"
Результат:
time | phrase | mvword | last_letter |
---|---|---|---|
2020 | world is never be the same | step stone moon | p e n |
2021 | be quick or be dad | rapid quick fast | d k t |
Пример 3
Создает новое поле, которое объединяет до трех совпадений буквы "e" в поле phrase.
Запрос:
... | rex field=phrase max_match=3 "(?<e_letter>e)"
Результат:
time | phrase | mvword | e_letter |
---|---|---|---|
2020 | world is never be the same | step stone moon | e e e |
2021 | be quick or be dad | rapid quick fast | e e |
SEARCH (FILTER)
Команда используется для получения из индекса необработанных данных.
Также команду можно применить для осуществления поиска по результатам запроса. В этом случае можно фильтровать события, указывая необходимые поля и используя ключевые слова или логические выражения. В том числе допустимо использование wildcard (*) для получения более широкого поля результатов.
Команда search также может быть использована в подзапросе. После получения данных из индекса, к ним можно применять различные команды трансформации, фильтрации и т.д. Отличие от команды otstats (которая читает проиндексированные данные) заключается в том, что search читает из файловой системы только поля _time и _raw, что может привести к необходимости проводить дополнительный парсинг во время поискового запроса.
Синтаксис команды
search <logical-expression> [<time>]
Для поиска по нескольким индексам и значениям полей можно использовать логические выражения (OR, AND). При чередовании через пробел нескольких индексов или полей, к ним применяется логический оператор OR. Стоит отметить, что необходимо учитывать тип данных поля, по которому производится поиск, так как к строковым значениям нельзя применить операции сравнения (<, >, >=, <=).
Обязательный параметр:
-
logical-expression – логическое выражение.
Выражение может содержать два и более варианта поиска, соединяемых логическими операторами, такими как OR или AND. Поиск по определенным значениям осуществляется с помощью знака равно "=" или не равно "!=". Может быть использован также оператор регулярных выражений wildcard (в конце строки) и знаки сравнения (<, >, >=, <=, !=) для числовых значений.
В случае, если команда используется в начале запроса для чтения необработанных данных, то должен быть указан индекс, из которого будет производиться чтение.
Опциональный параметр:
- time – в подзапросах (или основном запросе) могут использоваться дополнительные опции времени (latest= и earliest=) для поиска по другому временному интервалу. Временные рамки указываются в формате Epoch time (Linux time).
Примеры использования
Исходные данные:
Имеются два индекса с логами данных linux-log и nginx-log с полями _time, _raw.
Пример 1
Выводим данные из индекса linux-log:
... | search index="linux-log" | ...
Пример 2
Выводим данные из индекса linux-log и nginx-log:
... | search index="linux-log" index="nginx-log" | ...
Пример 3
Фильтруем данные, полученные в результате запроса. Ищем значение поля ID, равное 298, и значение результата, равное "DONE":
... | search ID=298 AND RESULT="DONE"
SORT
Команда sort сортирует результаты по указанному полю. События, в которых поле сортировки отсутствует, рассматриваются как имеющие наибольшее значение (в случае сортировки по возрастанию) и как имеющие наименьшее значение (в случае сортировки по убыванию).
Синтаксис команды
sort [count=<int>] [- | +]<sort-by-clause>...
Обязательный параметр:
-
[-|+]<sort-by-clause> – список полей, по которым будет выполнена сортировка:
-
При указании опционального знака минус (-) используется убывающий порядок сортировки.
-
При указании опционального знака плюс (+) используется возрастающий порядок сортировки.
По умолчанию используется возрастающий порядок сортировки.
При указании нескольких полей для сортировки, поля должны быть разделены запятыми или пробелами.
Синтаксис : [ - | + ] <sort-field1>, [ - | + ] <sort-field2> …
-
Опциональный параметр:
- count=<int> – если первым аргументом команды sort является count=<целое число>, то результатом сортировки будет только заданное число событий, а не отсортированные исходные данные в полном объеме.
Примеры использования
Исходные данные:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD | Russia | 7 |
1587045130 | EUR | Germany | 21 |
1587045140 | EUR | USA | 3 |
1587045150 | RUB | Germany | 19 |
1587045160 | EUR | Russia | 7 |
Пример 1
Сортирует по убыванию по полю sum и выводит три первых результата.
... | sort count=3 -sum
Результат:
datetime | currency | dest | sum |
---|---|---|---|
1587045130 | EUR | Germany | 21 |
1587045150 | RUB | Germany | 19 |
1587045110 | RUB | Russia | 10 |
Пример 2
Сортирует сначала по полю dest_country, а затем, в пределах набора событий с одинаковым значением поля dest_country, выполняет сортировку по полю sum.
... | sort dest_country sum
Результат:
datetime | currency | dest | sum |
---|---|---|---|
1587045150 | RUB | Germany | 19 |
1587045130 | EUR | Germany | 21 |
1587045120 | USD | Russia | 7 |
1587045110 | RUB | Russia | 10 |
1587045160 | EUR | Russia | 7 |
1587045140 | EUR | USA | 3 |
SPATH
Команда spath позволяет извлекать информацию из структурированных данных в формате JSON. Команда сохраняет эту информацию в одном или нескольких полях.
Синтаксис команды
spath [input=<field>] [output=<field>] path=<datapath>
Обязательный параметр:
- path=<datapath> – путь к значению, которое необходимо извлечь. Путь состоит из одного или нескольких шагов местоположения, разделенных точками. Шаг местоположения состоит из имени поля и необязательного индекса, заключенного в фигурные скобки. Индекс должен быть целым числом, чтобы ссылаться на положение данных в массиве (индексация начинается с нуля). Например, 'foo.bar.baz' или 'foo.bar.baz{2}'.
Опциональные параметры:
-
input=<field> – поле для чтения и извлечения значений.
Значение по умолчанию: _raw.
-
output=<field> – поле, в которое будет записано извлечённое значение. Если параметр не определён, именем поля для извлечённого значения становится значение параметра path.
Примеры использования
Пример 1
Извлекает из поля в JSON-формате сумму необходимой нам транзакции.
Исходные данные:
{
"transaction" : {
"1587045110" : {
"Russia": {
"RUB": 10
}
},
"1587045120" : {
"Russia" : {
"USD": 7
}
},
"1587045130" : {
"Germany": {
"EUR": 21
}
},
"1587045140" : {
"USA": {
"EUR": 3
}
}
}
}
Запрос:
... | spath input=_raw output=result path=transaction.1587045130.Germany.EUR
Результат:
result |
---|
21 |
Пример 2
Извлекает из поля в JSON-формате размер необходимой нам транзакции, ссылаясь на её положение в массиве (индекс).
Исходные данные:
{
"transaction" : {
"1587045110" : {
"Russia" : {
"RUB" : [144332, 345446, 2342456, 242456, 78856],
"EUR" : [353, 6556, 7676],
"USD" : [3535, 7676, 7668]
},
"Germany" : {
"RUB" : [13455],
"EUR" : [1445, 45656, 1000, 2543, 345336]
},
"USA" : {
"EUR" : [324343, 54664, 66565],
"USD" : [1000, 4545, 333, 500]
}
}
}
}
Запрос:
... | spath input=_raw output=result path=transaction.1587045110.Russia.RUB{2}
Результат:
result |
---|
2342456 |
STATS
Команда считает агрегирующую статистику, такую как среднее, количество, сумма и т.п., по имеющемуся набору данных. Процесс аналогичен SQL-агрегации. Если команда stats используется без BY группировки, то возвращается только один ряд, как совокупность всех данных входящего набора. Если применяется группировка BY, то возвращается один ряд для каждого уникального значения, входящего в набор, указанный после BY.
Синтаксис команды
stats <stats-функция>(field) [AS <field>] ... [BY <field-list>]
Синтаксис команды stats зависит от используемой функции (см. таблицу поддерживаемых функций). При выполнении команды можно использовать одну или более функций, но может быть использована только одна группировка BY.
Обязательные параметры:
-
stats-функция – статистическая функция, которая будет применена к полю. Перечень функций представлен в разделе ниже.
-
field – имя поля, к которому будет применена статистическая функция.
Опциональные параметры:
-
AS <field> – имя поля, в которое будет записан результат статистической функции. По умолчанию, если не указывается AS <field>, то именем поля будет сама применяемая функция.
-
BY <field-list> – группировка по определенному полю или списку полей.
Статистические функции
Функции позволяют получить различные статистики по полю или eval-выражению, к которому они применяются.
В таблице представлен перечень функций, сгруппированных по типам:
Имя функции | Описание функции |
---|---|
Агрегирующие функции: | |
approxdc() | Приблизительное количество уникальных значений. |
avg() | Среднее арифметическое. |
count() | Количество значений. |
distinct_count() | Количество уникальных значений. |
max() | Наибольшее значение. |
min() | Наименьшее значение. |
perc() | Процентиль. |
percentile_approx() | |
stdev() | Стандартное отклонение. |
sum() | Сумма значений. |
var() | Дисперсия. |
Порядковые функции: | |
first() | Первое значение в таблице. |
last() | Последнее значение в таблице. |
Функции для работы с multivalue-полями: | |
list() | Список значений. |
values() | |
Временные функции: | |
earliest() | Первое значение в таблице. |
latest() | Последнее значение в таблице. |
Примеры использования
Исходные данные:
Имеются таблица студентов разных возрастов.
Name | Surname | age |
---|---|---|
John | Snow | 10 |
Alex | Smith | 7 |
Anna | Show | 21 |
James | Bond | 3 |
John | Dow | 14 |
Пример 1
Считаем средний возраст студента.
Запрос:
... | stats avg(age) as AvgAge
Результат:
AvgAge |
---|
11 |
Пример 2
Выводим количество с группировкой по имени.
Запрос:
... | stats count(Surname) by Name
Результат:
Name | count |
---|---|
John | 2 |
James | 1 |
Alex | 1 |
Anna | 1 |
Пример 3
Выводим и средний возраст и количество с агрегацией по имени.
Запрос:
... | stats avg(age) as AvgAge, count(Surname) by Name
Результат:
Name | AvgAge | count |
---|---|---|
Anna | 21 | 1 |
Alex | 7 | 1 |
John | 12 | 2 |
James | 3 | 1 |
STREAMSTATS
Команда вычисляет статистику по значениям полей и добавляет поле результата к каждому событию.
Команда streamstats считает статистику от события к событию, формируя каждый раз новый результат в момент поступления очередного события на обработку. Такая обработка событий для подсчета статистики называется потоковой или стриминговой. Другими словами, команда streamstats рассчитывает статистику "по мере просмотра" событий, обновляя результат статистики для каждого просматриваемого события в момент его поступления на обработку.
Важно!
Порядок, в котором события будут поступать на обработку в команду
streamstats, определяется результатом выполнения предыдущих команд. Иногда,
при этом, одинаковый порядок событий не может быть гарантирован для разных
запусков запроса. В случае необходимости сохранения одного и того же порядка
событий для разных запусков запроса, необходимо предусмотреть сортировку событий
до их поступления на вход команды streamstats. Для этого можно
использовать команду sort.
Синтаксис команды
streamstats [window=<int>] [time_window=<span-length>] <stats-agg-term>... [BY <field-list>]
Обязательный параметр:
-
stats-agg-term – статистические функции, применяемые к полям и eval-выражениям. Результат выполнения функции может быть помещён в отдельное поле с именем, указанным после операнда AS.
Синтаксис:
<stats-func> ( <evaled-field> | <field> ) [AS <newfield>]Перечень функций представлен в разделе ниже.
Опциональные параметры:
-
BY <field-list> – одно или несколько полей, по которым будет производиться группировка вычисляемой статистики.
-
time_window=<span-length> – временное окно для выполнения "потоковых вычислений". Статистика, определенная аргументом stats-agg-term, считается для событий, которые попадают во временное окно, заданное аргументом time_window. Аргумент time_window ограничен диапазоном значения поля _time для обрабатываемых событий. Для использования аргумента time_window события должны быть отсортированы в убывающем или возрастающем порядке по полю _time. Аргумент time_window может использоваться вместе с аргументом window.
Синтаксис: time_window=<span-length>, где <span-length> – диапазон времени в секундах.
-
window=<int> – количество событий, в пределах которого происходит подсчет статистики. Если window равно нулю, то расчет статистики будет выполнен только для одного события – того, которое обрабатывается в данный момент.
Статистические функции
Функции позволяют получить различные статистики по полю или eval-выражению, к которому они применяются.
В таблице представлен перечень функций, сгруппированных по типам:
Имя функции | Описание функции |
---|---|
Агрегирующие функции: | |
approxdc() | Приблизительное количество уникальных значений. |
avg() | Среднее арифметическое. |
count() | Количество значений. |
distinct_count() | Количество уникальных значений. |
max() | Наибольшее значение. |
min() | Наименьшее значение. |
perc() | Процентиль. |
percentile_approx() | |
stdev() | Стандартное отклонение. |
sum() | Сумма значений. |
var() | Дисперсия. |
Порядковые функции: | |
first() | Первое значение в таблице. |
last() | Последнее значение в таблице. |
Функции для работы с multivalue-полями: | |
list() | Список значений. |
values() | |
Временные функции: | |
earliest() | Первое значение в таблице. |
latest() | Последнее значение в таблице. |
Примеры использования
Исходные данные:
_time | dest_country | currency | sum |
---|---|---|---|
2019-10-02 12:20:00 | Italy | EUR | 10 |
2019-10-02 12:20:01 | Russia | USD | 13 |
2019-10-02 12:20:02 | Canada | RUB | 14 |
2019-10-02 12:20:03 | Canada | EUR | 1 |
2019-10-02 12:20:04 | Russia | USD | 3 |
2019-10-02 12:20:05 | Italy | RUB | 4 |
2019-10-02 12:20:06 | Italy | RUB | 5 |
Пример 1
Просматривает подряд события в таблице и, по мере просмотра, вычисляет три новых поля. Вычисление происходит таким образом, что на момент просмотра очередного события в трех новых полях находятся, соответственно, максимальное, минимальное и сумма значений этого поля sum среди тех событий, которые уже просмотрены.
Запрос:
... | streamstats count as count max(sum) as "max num" min(sum) as "min num" sum(sum) as "sum num"
Результат:
_time | count | currency | dest_country | max num | min num | sum | sum num |
---|---|---|---|---|---|---|---|
2019-10-02 12:20:00 | 1 | EUR | Italy | 10 | 10 | 10 | 10 |
2019-10-02 12:20:01 | 2 | USD | Russia | 13 | 10 | 13 | 23 |
2019-10-02 12:20:02 | 3 | RUB | Canada | 14 | 10 | 14 | 37 |
2019-10-02 12:20:03 | 4 | EUR | Canada | 14 | 1 | 1 | 38 |
2019-10-02 12:20:04 | 5 | USD | Russia | 14 | 1 | 3 | 41 |
2019-10-02 12:20:05 | 6 | RUB | Italy | 14 | 1 | 4 | 45 |
2019-10-02 12:20:06 | 7 | RUB | Italy | 14 | 1 | 5 | 50 |
Пример 2
Просматривает подряд события в таблице и, по мере просмотра, вычисляет новое поле count – количество переводов в разрезе валюты (currency). Вычисление происходит таким образом, что на момент просмотра очередного события поле count содержит статистику только в отношении тех событий, которые уже просмотрены.
Запрос:
... | streamstats count by currency
Результат:
_time | count | currency | dest_country | sum |
---|---|---|---|---|
2019-10-02 12:20:00.000+0300 | 1 | EUR | Italy | 10 |
2019-10-02 12:20:01.000+0300 | 1 | USD | Russia | 13 |
2019-10-02 12:20:02.000+0300 | 1 | RUB | Canada | 14 |
2019-10-02 12:20:03.000+0300 | 2 | EUR | Canada | 1 |
2019-10-02 12:20:04.000+0300 | 2 | USD | Russia | 3 |
2019-10-02 12:20:05.000+0300 | 2 | RUB | Italy | 4 |
2019-10-02 12:20:06.000+0300 | 3 | RUB | Italy | 5 |
Пример 3
Просматривает подряд события в таблице и, по мере просмотра, вычисляет новое поле total – сумма переводов за определенное количество транзакций. Вычисление происходит таким образом, что на момент просмотра очередного события поле total содержит статистику только в отношении тех событий, которые уже просмотрены. Статистика вычисляется в бегущем окне из трех событий. То есть событие, которое отстает от текущего просматриваемого на 3 события и более, не участвует в статистике.
Запрос:
... | streamstats window=3 sum(sum) as "total"
Результат:
_time | currency | dest_country | sum | total |
---|---|---|---|---|
2019-10-02 12:20:00 | EUR | Italy | 10 | 10 |
2019-10-02 12:20:01 | USD | Russia | 13 | 23 |
2019-10-02 12:20:02 | RUB | Canada | 14 | 37 |
2019-10-02 12:20:03 | EUR | Canada | 1 | 28 |
2019-10-02 12:20:04 | USD | Russia | 3 | 18 |
2019-10-02 12:20:05 | RUB | Italy | 4 | 8 |
2019-10-02 12:20:06 | RUB | Italy | 5 | 12 |
SUPERJOIN
Команда superjoin комбинирует данные из таблицы, указанной в параметрах команды superjoin, с результатами основного запроса без каких-либо ограничений на размер таблицы.
Важно!
Команда superjoin не является частью стандартного набора команд. Находится в
плагине OTLExtend.
Синтаксис команды
superjoin <field-list> <superjoin-params>
Обязательные параметры:
-
field-list – поля, по которым будет выполнена команда superjoin. Совпадение значений полей основного запроса и подзапроса должно быть с точностью до регистра отдельных символов.
Синтаксис: <field1>, <field2>, ...
-
superjoin-params – опции команды superjoin.
Синтаксис:
type=(inner|outer|left) format=(parquet|csv|orc|) path=(parquet|csv|orc|)
Описание:
-
type – тип команды superjoin.
Синтаксис: type=inner | outer | left.
Значение по умолчанию отсутствует.
Разница между типами заключается в том, каким образом обрабатываются события основного запроса, которые не могут быть поставлены в соответствие событиям из таблицы. Как в inner так и в left возвращаются только те события, которые могут быть поставлены в соответствие друг другу по заданному полю. Однако результаты inner join не включают события основного запроса, которые не имеют совпадений в присоединяемой таблице. Результат же left join (или outer join) включает все события основного запроса и те события из присоединяемой таблицы, которые могут быть поставлены в соответствие событиям основного запроса по заданному полю.
-
format – формат таблицы, с которой соединяются результаты основного запроса.
Синтаксис: format=(parquet|csv|orc|).
Значение по умолчанию отсутствует.
-
path – путь к таблице с которой соединяются результаты основного запроса в external_data.
Синтаксис: path=(path/to/table).
Значение по умолчанию отсутствует.
-
Пример использования
...| superjoin id, day type=left format=parquet path=folder/table1
TAIL
Возвращает последнее N число указанных результатов. События возвращаются в обратном порядке, начиная с конца набора результатов.
Важно!
Порядок, в котором события будут поступать на обработку в команду tail,
определяется результатам выполнения предыдущих команд. В случае необходимости
сохранения одного и того же порядка событий, необходимо предусмотреть сортировку
событий внутри запроса. Например, с помощью команды sort.
Синтаксис команды
tail [<N>] | [limit=<int>]
Опциональные параметры:
-
N – количество возвращаемых результатов.
Значение по умолчанию = 10.
-
limit=<int> – другой вариант задания количества возвращаемых результатов.
Примеры использования
Пример 1
Возвращает последние четыре транзакции из списка.
Исходные данные:
datetime | currency | dest | sum |
---|---|---|---|
1587045110 | RUB | Russia | 10 |
1587045120 | USD | Russia | 7 |
1587045130 | EUR | Germany | 21 |
1587045140 | EUR | USA | 3 |
1587045150 | RUB | Germany | 19 |
1587045160 | EUR | Russia | 7 |
Запрос:
... | tail 4
Результат:
datetime | currency | dest | sum |
---|---|---|---|
1587045130 | EUR | Germany | 21 |
1587045140 | EUR | USA | 3 |
1587045150 | RUB | Germany | 19 |
1587045160 | EUR | Russia | 7 |
TIMECHART
Команда создает диаграмму временного ряда с соответствующей ей статистической таблицей.
Диаграмма временного ряда – это диаграмма с отображением времени на оси X. По оси Y отображаются значения, вычисленные применением к какому-либо полю статистической агрегации.
Синтаксис команды
timechart [span=<timescale>] (<stats-agg-term>
BY <split-by-clause>)
Обязательные параметры:
-
stats-agg-term – статистические функции (перечень см. в разделе ниже), применяемые к полям и eval-выражениям. Результат выполнения функции может быть помещён в отдельное поле с именем, указанным после операнда AS.
Синтаксис: <stats-func>( <evaled-field> | <wc-field> ) [AS <new-field>].
-
BY <split-by-clause> – поле для разделения результатов.
Каждый раз, когда вызывается команда timechart, можно использовать одну или несколько функций. Однако оператор BY можно использовать только один раз.
Опциональный параметр:
- span=<timescale> – временной интервал для группировки. Возможные варианты указаны в таблице ниже.
Временные рамки | Доступный синтаксис | Описание |
---|---|---|
<sec> | "s" | "sec" | Шкала времени в секундах |
<min> | "m" | "min" | Шкала времени в минутах |
<hr> | "h" | Шкала времени в часах |
<day> | "d" | Шкала времени в днях |
<week> | "w" | Шкала времени в неделях |
<month> | "mon" | Шкала времени в месяцах |
Статистические функции
Функции позволяют получить различные статистики по полю или eval-выражению, к которому они применяются.
В таблице представлен перечень функций, сгруппированных по типам:
Имя функции | Описание функции |
---|---|
Агрегирующие функции: | |
approxdc() | Приблизительное количество уникальных значений. |
avg() | Среднее арифметическое. |
count() | Количество значений. |
distinct_count() | Количество уникальных значений. |
max() | Наибольшее значение. |
min() | Наименьшее значение. |
perc() | Процентиль. |
percentile_approx() | |
stdev() | Стандартное отклонение. |
sum() | Сумма значений. |
var() | Дисперсия. |
Порядковые функции: | |
first() | Первое значение в таблице. |
last() | Последнее значение в таблице. |
Функции для работы с multivalue-полями: | |
list() | Список значений. |
values() | |
Временные функции: | |
earliest() | Первое значение в таблице. |
latest() | Последнее значение в таблице. |
Примеры использования
Пример 1
Агрегирует в интервалы по двое суток статистику размеров авиатрафика.
Исходные данные:
Terminal | _time | Arrivals | Departures |
---|---|---|---|
TerminalA | 1556704800 | 235 | 321 |
TerminalB | 1556704800 | 178 | 167 |
TerminalC | 1556704800 | 79 | 68 |
TerminalA | 1556791200 | 216 | 278 |
TerminalB | 1556791200 | 165 | 145 |
TerminalC | 1556791200 | 64 | 60 |
TerminalA | 1556877600 | 223 | 216 |
TerminalB | 1556877600 | 143 | 120 |
TerminalC | 1556877600 | 87 | 98 |
TerminalA | 1556964000 | 145 | 256 |
TerminalB | 1556964000 | 124 | 167 |
TerminalC | 1556964000 | 89 | 51 |
TerminalA | 1557050400 | 256 | 170 |
TerminalB | 1557050400 | 146 | 198 |
TerminalC | 1557050400 | 95 | 101 |
Запрос:
...
| eval Air_traffic=Arrivals+Departures
| timechart span=2d sum(Air_traffic) by Terminal
| rename _time as Time
| eval Time=strftime(Time, "%Y-%m-%dT%H:%M:%S")
В запросе время конвертируется из Unix-time формата в понятный для человека формат.
Результат:
Time | TerminalA | TerminalB | TerminalC |
---|---|---|---|
2019-04-30T03:00:00 | 556 | 345 | 147 |
2019-05-02T03:00:00 | 933 | 573 | 309 |
2019-05-04T03:00:00 | 827 | 635 | 336 |
Пример 2
Агрегирует в интервалы по двое суток минимальное и максимальное значения авиатрафика.
Исходные данные:
Terminal | _time | Arrivals | Departures |
---|---|---|---|
TerminalA | 1556704800 | 235 | 321 |
TerminalB | 1556704800 | 178 | 167 |
TerminalC | 1556704800 | 79 | 68 |
TerminalA | 1556791200 | 216 | 278 |
TerminalB | 1556791200 | 165 | 145 |
TerminalC | 1556791200 | 64 | 60 |
TerminalA | 1556877600 | 223 | 216 |
TerminalB | 1556877600 | 143 | 120 |
TerminalC | 1556877600 | 87 | 98 |
TerminalA | 1556964000 | 145 | 256 |
TerminalB | 1556964000 | 124 | 167 |
TerminalC | 1556964000 | 89 | 51 |
TerminalA | 1557050400 | 256 | 170 |
TerminalB | 1557050400 | 146 | 198 |
TerminalC | 1557050400 | 95 | 101 |
Запрос:
...
| eval Air_traffic=Arrivals+Departures
| timechart span=2d max(Air_traffic) as "max" min(Air_traffic) as "min" by Terminal
| rename _time as Time
| eval Time=strftime(Time, "%Y-%m-%dT%H:%M:%S")
В запросе время конвертируется из Unix-time формата в понятный для человека формат.
Результат:
Time | max: TerminalA | min: TerminalA | max: TerminalB | min: TerminalB | max: TerminalC | min: TerminalC |
---|---|---|---|---|---|---|
2019-05-02T03:00:00 | 494 | 439 | 310 | 263 | 185 | 124 |
2019-05-04T03:00:00 | 426 | 401 | 344 | 291 | 196 | 140 |
TOP
Команда находит наиболее часто встречающиеся значения в выбранных полях.
Синтаксис команды
top [<number>] <field-list> [<by-clause>]
Команда вычисляет количество и процентное соотношение того, как часто выбранные значения встречаются в событиях. Если добавлена опция by-clause, то результат будет сгруппирован по полю, указанному после by.
Обязательный параметр:
- field-list – поле или список полей (через запятую или пробел), по которым проводится подсчёт.
Опциональный параметр:
-
number – указывается количество верхних строк, которые должны быть выведены в результате. По умолчанию: 10.
-
by-clause – одно или несколько полей, значения которых будут названиями столбцов в результирующей таблице.
Пример использования
Выводит 3 наиболее часто встречающихся Имени.
Исходные данные:
Name | Surname | age |
---|---|---|
John | Snow | 10 |
Alex | Smith | 7 |
Anna | Show | 21 |
John | Bond | 3 |
John | Smith | 19 |
Tony | Stark | 5 |
John | Dow | 19 |
Tony | Pitt | 5 |
Запрос:
... | top 3 Name
Результат:
Name | count | percent |
---|---|---|
John | 4 | 50 |
Tony | 2 | 25 |
Alex | 1 | 12.5 |
TRANSACTION
Команда позволяет найти среди множества записей, сгруппированных по указанному набору полей, первую по времени запись (в своей группе).
Например, исходные данные содержат название месторождения, название метрики и значение метрики. Для такого набора данных команда transaction позволяет найти первую по времени запись для каждого уникального значения каждой уникальной метрики для каждого уникального месторождения. Транзакцией в данном случае называется совокупность следующих данных: название месторождения, название метрики, значение метрики.
Исходя из описания, следует отметить, что исходный набор данных должен содержать временную отметку в виде поля _time (время измерения). Если поле _time отсутствует, то команда вернет набор данных, сгруппированный по полям, указанным в параметрах. При этом поля, не указанные в параметрах команды, но присутствующие в наборе данных, будут представлены массивами своих значений.
Например, если в описанном выше наборе данных есть поле с номером скважины (при этом на одном месторождении может располагаться несколько скважин), но его нет среди параметров команды transaction (то есть группировка по нему не производится), то в результирующем наборе это поле будет представлено массивом значений, соответствующих транзакции с полями название месторождения, название метрики, значение метрики.
Использование команды transaction c набором данных без поля _time, а также включение данного поля в список параметров команды нежелательно. Если поле _time будет указано среди параметров, то группировка будет производиться в том числе и по нему, что лишает смысла использование команды.
Более детально рассмотрим правила работы команды на примерах ниже.
Синтаксис команды
transaction [field-list]
Обязательные параметры: отсутствуют.
Опциональный параметр:
-
field-list – непустой список полей, по которым будет формироваться транзакция.
Синтаксис: <field1>, <field2>, ...
Примеры использования
Исходные данные:
Набор представляет результаты измерений двух метрик – температуры и влажности – на скважинах нескольких месторождений. На одно месторождение может приходиться несколько скважин.
_time | deposit | well | metric_name | value |
---|---|---|---|---|
1641744164 | "deposit_1" | "well_1" | temperature | 27 |
1641744164 | "deposit_1" | "well_2" | temperature | 27 |
1641744164 | "deposit_2" | "well_1" | temperature | 27 |
1641744164 | "deposit_2" | "well_2" | temperature | 27 |
1641744164 | "deposit_3" | "well_1" | temperature | 27 |
1641744364 | "deposit_1" | "well_1" | temperature | 26 |
1641744364 | "deposit_2" | "well_2" | temperature | 25 |
1641744364 | "deposit_3" | "well_1" | temperature | 27 |
1641744164 | "deposit_1" | "well_2" | humidity | 47 |
1641744164 | "deposit_2" | "well_1" | humidity | 67 |
1641744164 | "deposit_3" | "well_2" | humidity | 57 |
1641744364 | "deposit_1" | "well_1" | humidity | 36 |
1641744364 | "deposit_1" | "well_2" | humidity | 36 |
1641744364 | "deposit_2" | "well_2" | humidity | 55 |
1641744364 | "deposit_3" | "well_1" | humidity | 57 |
Пример 1
Исходные данные содержат поле _time, однако среди параметров команды поле _time отсутствует. При этом все поля исходных данных указаны в списке параметров команды. В этом случае команда вернёт набор уникальных транзакций с полями deposit, well, metric_name и value. Каждая уникальная транзакция при этом будет иметь в качестве поля _time минимальное значение времени среди всех записей исходных данных, подходящих под ограничения данной транзакции.
Запрос:
... | transaction deposit, well, metric_name, value
Результат:
deposit | well | metric_name | value | _time |
---|---|---|---|---|
"deposit_2" | "well_2" | humidity | 55 | 1641744364 |
"deposit_1" | "well_1" | humidity | 36 | 1641744364 |
"deposit_1" | "well_1" | temperature | 27 | 1641744164 |
"deposit_2" | "well_1" | temperature | 27 | 1641744164 |
"deposit_2" | "well_1" | humidity | 67 | 1641744164 |
"deposit_3" | "well_1" | temperature | 27 | 1641744164 |
"deposit_1" | "well_1" | temperature | 26 | 1641744364 |
"deposit_1" | "well_2" | humidity | 36 | 1641744364 |
"deposit_1" | "well_2" | humidity | 47 | 1641744164 |
"deposit_3" | "well_2" | humidity | 57 | 1641744164 |
"deposit_3" | "well_1" | humidity | 57 | 1641744364 |
"deposit_2" | "well_2" | temperature | 27 | 1641744164 |
"deposit_2" | "well_2" | temperature | 25 | 1641744364 |
"deposit_1" | "well_2" | temperature | 27 | 1641744164 |
Пример 2
Исходные данные содержат поле _time, однако среди параметров команды поле _time отсутствует. При этом не все поля исходных данных указаны в списке параметров команды (отсутствует well). В этом случае команда вернёт набор уникальных транзакций с полями deposit, metric_name и value. Поле с названием скважины well будет представлено массивом. Если одно и то же значение конкретной метрики на конкретном месторождении встречается одновременно на нескольких скважинах, то в этом поле будут указаны все такие скважины (одному уникальному сочетанию значений полей deposit, metric_name, value соответствует несколько скважин, которые и представлены массивом названий). Каждая уникальная транзакция при этом будет иметь в качестве поля _time минимальное значение времени среди всех записей исходных данных, подходящих под ограничения данной транзакции.
Запрос:
... | transaction deposit, metric_name, value
Результат:
deposit | metric_name | value | _time | well |
---|---|---|---|---|
"deposit_2" | humidity | 55 | 1641744364 | [ "well_2" ] |
"deposit_3" | humidity | 57 | 1641744164 | [ "well_2", "well_1" ] |
"deposit_3" | temperature | 27 | 1641744164 | [ "well_1" ] |
"deposit_1" | humidity | 47 | 1641744164 | [ "well_2" ] |
"deposit_1" | temperature | 26 | 1641744364 | [ "well_1" ] |
"deposit_2" | temperature | 27 | 1641744164 | [ "well_2" , "well_1" ] |
"deposit_2" | temperature | 25 | 1641744364 | [ "well_2" ] |
"deposit_1" | humidity | 36 | 1641744364 | [ "well_2" , "well_1" ] |
"deposit_1" | temperature | 27 | 1641744164 | [ "well_2" , "well_1" ] |
"deposit_2" | humidity | 67 | 1641744164 | [ "well_1" ] |
Пример 3
Исходные данные содержат поле _time, поле _time присутствует среди параметров команды. При этом все поля исходных данных указаны в списке параметров команды. В этом случае команда вернет набор записей, сгруппированных по параметрам, которые присутствуют в наборе данных, но отсутствуют среди параметров команды. А поскольку в параметрах команды указаны все поля исходного набора, группировка будет производиться по всем полям в наборе данных. Таким образом, команда вернёт набор данных, аналогичный исходному (порядок записей при этом может отличаться от исходного).
Запрос:
... | transaction deposit, well, metric_name, value, _time
Пример 4
Исходные данные содержат поле _time, поле _time присутствует среди параметров команды. При этом не все поля исходных данных указаны в списке параметров (отсутствует – well). В этом случае команда вернет набор записей, сгруппированных по параметрам, которые присутствуют в наборе данных, но отсутствуют среди параметров команды. В данном случае среди параметров отсутствует только поле well, поэтому данное поле будет представлено массивом, содержащим все названия скважин, соответствующие уникальному сочетанию значений полей _time, deposit, metric_name, value.
Запрос:
... | transaction deposit, metric_name, value, _time
Результат:
deposit | metric_name | value | _time | well |
---|---|---|---|---|
"deposit_1" | temperature | 26 | 1641744364 | [ "well_1" ] |
"deposit_3" | temperature | 27 | 1641744364 | [ "well_1" ] |
"deposit_3" | temperature | 27 | 1641744164 | [ "well_1" ] |
"deposit_2" | humidity | 55 | 1641744364 | [ "well_2" ] |
"deposit_3" | humidity | 57 | 1641744364 | [ "well_1" ] |
"deposit_1" | humidity | 47 | 1641744164 | [ "well_2" ] |
"deposit_1" | humidity | 36 | 1641744364 | [ "well_2" , "well_1" ] |
"deposit_1" | temperature | 27 | 1641744164 | [ "well_2" , "well_1" ] |
"deposit_2" | temperature | 27 | 1641744164 | [ "well_2" , "well_1" ] |
"deposit_3" | humidity | 57 | 1641744164 | [ "well_2" ] |
"deposit_2" | humidity | 67 | 1641744164 | [ "well_1" ] |
"deposit_2" | temperature | 25 | 1641744364 | [ "well_2" ] |
TRANSPOSE
Команда возвращает заданное число рядов поисковых результатов в виде колонок – происходит операция транспонирования.
Синтаксис команды
transpose [int] [column_name=<string>] [header_field=<field>] [include_empty=<bool>]
Обязательные параметры: отсутствуют.
Опциональные параметры:
-
column_name – имя, которое будет носить первая колонка. Значениями ячеек в этой колонке будут наименования столбцов до применения команды transpose.
Значение по умолчанию: column.
-
header_field – имя колонки до трансформации, значения из которой будут использованы как имена колонок (кроме первой колонки) в транспонированных данных.
Значение по умолчанию: row 1, row 2, row 3, и т.д.
-
include_empty – определяет включать (true) или нет (false) в операцию транспонирования те поля, которые содержат пустые и только пустые значения.
Значение по умолчанию: true.
-
int – определяет количество рядов для транспонирования. Чтобы транспонировать все ряды, значение параметра должно быть равно нулю.
Значение по умолчанию: 5.
Примеры использования
Исходные данные:
currency | dest_country | sum |
---|---|---|
RUB | Russia | 10 |
USD | Russia | 7 |
EUR | Germany | 21 |
EUR | USA | 3 |
RUB | Germany | 19 |
EUR | Russia | 7 |
Пример 1
Транспонирует таблицу, выводит 5 результатов транспонирования (значение по умолчанию), переименовывает первую колонку из названия по умолчанию в col_values (из column в col_values).
Запрос:
... | transpose column_name=col_values
Результат:
col_values | row 1 | row 2 | row 3 | row 4 | row 5 |
---|---|---|---|---|---|
currency | RUB | USD | EUR | EUR | RUB |
dest_country | Russia | Russia | Germany | USA | Germany |
sum | 10 | 7 | 21 | 3 | 19 |
Пример 2
Транспонирует таблицу, в качестве имен столбцов берутся значения столбца dest_country до транспонирования.
... | transpose header_field=dest_country
Результат:
column | Russia | Germany | USA |
---|---|---|---|
currency | USD | USD | RUB |
sum | 7 | 7 | 19 |
UNTABLE
Команда преобразует данные, изначально представленные в виде широкой таблицы, в длинную таблицу.
Примечание.
В широкой таблице каждая метрика представлена в отдельной колонке. В длинной
таблице есть колонка, содержащая имена метрик, колонка, содержащая значения
метрик (пара "ключ-значение").
Команда позволяет, зафиксировав значение одной из колонок (например, поле _time), разбить каждую из строк исходной таблицы на несколько строк в результирующей таблице.
Синтаксис команды
untable <fixed_column=<string>>, <field_column=<string>>, <value_column=<string>>
Обязательные параметры:
-
fixed_column – имя колонки, по которой будут группироваться данные (чаще всего используется колонка с полем _time).
-
field_column – имя колонки, которая будет содержать имена метрик.
-
value_column – имя колонки, в которую нужно поместить значения метрик.
Опциональные параметры отсутствуют.
Пример использования
Нужно преобразовать широкую таблицу в длинную. Данные группируются по полю _time. Каждая исходная строка разбивается на 4 строки.
Исходные данные:
_time | temperature | humidity | carbon_dioxide_level | air_pressure |
---|---|---|---|---|
1641744664 | 27 | 42 | 452 | 756 |
1641744774 | 18 | 37 | 537 | 759 |
1641744884 | 23 | 47 | 425 | 763 |
Запрос:
... | untable _time, metric_name, value
Результат:
_time | metric_name | value |
---|---|---|
1641744664 | temperature | 27 |
1641744664 | humidity | 42 |
1641744664 | carbon_dioxide_level | 452 |
1641744664 | air_pressure | 756 |
1641744774 | temperature | 18 |
1641744774 | humidity | 37 |
1641744774 | carbon_dioxide_level | 537 |
1641744774 | air_pressure | 759 |
1641744884 | temperature | 23 |
1641744884 | humidity | 47 |
1641744884 | carbon_dioxide_level | 425 |
1641744884 | air_pressure | 763 |
WHERE
Команда where использует eval-выражения для фильтрации результатов запроса. Эти eval-выражения должны быть булевыми выражениями, то есть возвращать true или false значения. Команда where пропускает только те результаты, для которых eval-выражения возвращают true.
Синтаксис команды
where <eval-expression>
Команда where использует синтаксис, схожий с командой eval.
Команда интерпретирует строки, заключенные в кавычки, как строковые значения. Если строка не имеет кавычек, то она обрабатывается как поле. Эта особенность позволяет, в отличие от команды search, сравнивать два отдельных поля.
Для поиска по нескольким значениям полей можно использовать логические выражения: or, and. Также необходимо учитывать тип данных того поля, по которому производится поиск, так как к строковым значениям нельзя применить операции сравнения (<, >, >=, <=).
Обязательный параметр:
- eval-expression – операции сравнения, логические выражения, в том числе содержащие функции (перечень функций представлен ниже).
Таблица указывает на особенности синтаксиса, которые нужно учитывать при построении запроса:
Символы в выражениях | Описание | Пример |
---|---|---|
Имена полей начинаются с числа | Если выражение обращается к полю, имя которого начинается с цифры, рекомендуется такое поле заключать в одинарные кавычки (апострофы). | '10km'="far" Это выражение представляет собой поле, которое сравнивается со строкой. Так как поле начинается с цифры, оно заключено в одинарные кавычки, а строка заключена в двойные кавычки. |
Имена полей, содержащие не цифро-буквенные символы. | Если выражение обращается к полю, имя которого содержит не цифро-буквенные символы, то это поле должно быть заключено в одинарные кавычки (апострофы). | coord=xy+'point-1' Это выражение могло быть интерпретировано как математическое сравнение, где дефис считался бы минусом. Для того, чтобы избежать этого, нужно заключить поле point-1 в одинарные кавычки. |
Строки | Если выражение указывает определенную строку, то эту строку следует заключать в двойные кавычки. | coord="position-"+count Здесь position- могло бы быть интерпретировано как поле или как часть математического сравнения, которое использует знаки плюс и минус. Чтобы убедиться, что строка интерпретируется правильно, position- заключается в двойные кавычки. |
Булевые выражения проходят обработку командой where в следующей последовательности:
NOT условие
AND условие
OR условие
Символ регулярного выражения звездочка (wildcard) может быть использован только в функции like().
Сравнительная функция like() возвращает TRUE если значение поля (или просто строка) согласуется с заданным выражением.
Синтаксис: like(TEXT, PATTERN)
Аргументы функции:
-
TEXT – строка или поле, которое проверяется.
-
PATTERN – строка-выражение, с которым сравнивается TEXT.
Можно использовать символ процент (%) для нескольких (одного и более) строковых символов или символ подчёркивания (_) для одного символа.
Символ процента ( % ) является заменой символа wildcard (*).
Вы можете использовать довольно широкий набор функций в команде where. Все они представлены в таблице:
Тип функции | Функции и синтаксис |
---|---|
Сравнительные и условные функции | case(X,"Y",...), coalesce(X,...), if(X,Y,Z), like(TEXT, PATTERN), match(SUBJECT, "REGEX"), nullif(X,Y), true() |
Функции конвертации | printf, tonumber(NUMSTR,BASE), tostring(X,Y) |
Криптографические функции | md5(X), sha1(X) |
Функции даты и времени | now(), relative_time(X,Y), strptime(X,Y) |
Информационные функции | isnotnull(X), isnull(X) |
Математические функции | abs(X), ceiling(X) или ceil(X), exp(X), floor(X), ln(X), log(X,Y), pi(), pow(X,Y), round(X,Y), sqrt(X) |
Функции преобразования для мультизначений | mvappend(X,...), mvcount(MVFIELD), mvdedup(X), mvfind(MVFIELD,"REGEX"), mvindex(MVFIELD,STARTINDEX, ENDINDEX), mvjoin(MVFIELD,STR), mvrange(X,Y,Z), mvsort(X), mvzip(X,Y,"Z"), split(X,"Y") |
Статистические функции | max(X,...), min(X,...) |
Текстовые функции | len(X), lower(X), replace(X,Y,Z), substr(X,Y,Z), upper(X) |
Тригонометрические и гиперболические функции | acos(X), asin(X), atan(X), atan2(Y, X), cos(X), hypot(X,Y), sin(X), tan(X) |
Примеры использования
Исходные данные:
Имеются таблица студентов разных возрастов.
Name | Surname | age |
---|---|---|
John | Snow | 10 |
Alex | Smith | 7 |
Anna | Show | 21 |
James | Bond | 3 |
John | SMITH | 19 |
Tony | Stark | 5 |
John | Dow | 14 |
Tony | Pitt | 5 |
Пример 1
Выводим всех студентов по фамилии "Smith", учитывая, что фамилии написаны в разных регистрах.
Запрос:
... | where lower(Surname)="smith"
Результат:
Name | Surname | age |
---|---|---|
Alex | Smith | 7 |
John | SMITH | 19 |
Пример 2
Выводим всех студентов старше 10 лет и с именем, начинающимся на букву "J".
Запрос:
... | where age>10 and like(Name,"J%")
Результат:
Name | Surname | age |
---|---|---|
John | Snow | 10 |
James | Bond | 3 |
John | SMITH | 19 |
John | Dow | 14 |
XYSERIES
Команда конвертирует результаты в табличный формат, пригодный для визуализации результата в формате диаграммы или графика.
Синтаксис команды
xyseries <x-field> <y-name-field> <y-data-field>
Обязательные параметры:
-
x-field – значения поля, которые будут отложены на оси Х при рисовании графика. Синтаксис: <field>.
-
y-name-field – значения поля, которые будут отложены на оси Y при рисовании графика. Синтаксис: <field>.
-
y-data-field – значения поля, которые будут точками графика.
Синтаксис: <field>.
Опциональные параметры: отсутствуют.
Примеры использования
Исходные данные:
currency | dest_country | sum |
---|---|---|
EUR | Italy | 10 |
USD | Russia | 13 |
RUB | Canada | 14 |
EUR | Canada | 1 |
USD | Russia | 3 |
MXN | Mexico | 7 |
Пример 1
Форматирует данные к пригодному для визуализации виду. По оси Х будут отложены значения поля dest_country, по оси Y значения поля currency, точками графика (или диаграммы) будут значения поля sum. Результат может быть визуализирован, например, в формате столбчатой диаграммы.
Запрос:
| xyseries dest_country currency sum
Результат:
EUR | MXN | RUB | USD | dest_country |
---|---|---|---|---|
10 | Italy | |||
7 | Mexico | |||
13 | Russia | |||
1 | 14 | Canada |
Приложение
Использование макросов в запросах
Реализация данной функциональности связана с оптимизацией использования в OTL-запросах повторяющихся наборов команд. Для этих целей повторяющиеся последовательности можно оформить в виде макросов.
Синтаксис использования макроса
|__<имя макроса>__ <аргументы макроса>
_<имя макроса>_ – имя макроса с двух сторон обрамляется двойным подчёркиванием (__);
<аргументы макроса> – аргументы макроса, разделённые пробелами; аргументы могут быть следующих типов:
-
Аргументы значений:
-
<имя поля/токена>=<значения через запятую>;
-
отсутствие аргумента/аргументов при наличии токена макрос интерпретирует как: absent_arg=*.
-
-
Аргументы времени.
В качестве аргументов времени используются ключевые слова:
-
latest – начальная граница временного интервала;
-
earliest – конечная граница временного интервала.
Формат даты в аргументе: YYYY-MM-DD. В процессе обработки макроса дата преобразуется в формат Epoch time (Linux time).
Возможные комбинации значений аргументов:
-
earliest=2019-11-01 latest=2019-12-31 – задаёт период с 2019/11/01 по 2019/12/31;
-
earliest=2019-11-01 – задаёт период с 2019/11/01 по настоящее время;
-
latest=2019-12-31 – задаёт период с 1970/01/01 по 2019/12/31;
-
аргументы не заданы – временное окно определяется в границах с 1970/01/01 по настоящее время.
-
-
Аргументы фильтрации полей.
В качестве аргумента указываются шаблоны поиска заданной последовательности символов в именах полей, которые должны быть отражены в итоговой таблице после выполнения запроса.
По заданным шаблонам происходит поиск имен полей в файле алиасов (см. в разделе ниже) без учета регистра.
В случае отсутствия полей, удовлетворяющих условиям фильтрации, макрос отработает по всем полям.
Пример.
| __getwell__ wellNum=4,12,1898 padNum=4 earliest=2019-11-01
latest=2019-12-31 debit freq
Имя макроса: _ _ getwell _ _
Аргументы значений: wellNum, padNum
аргумент wellNum=4,12,1898
интерпретируется как wellNum=4 OR wellNum=12 OR wellNum=1898
Аргументы времени: earliest, latest
earliest=2019-11-01 latest=2019-12-31 – аргументы задают период с 2019/11/01 по 2019/12/31
Аргументы фильтрации полей: debit, freq
По заданным шаблонам debit и freq будут отобраны следующие поля (см. пример в файле алиасов ниже):
debit:
adkuLiquidDebit
wellopLiquidDebitTM
freq:
ksADKUEngineFreq
wellopPumpFreqTm
На выходе получим следующий текст сгенерированного запроса:
| table _time, wellNum, padNum, adkuLiquidDebit,
wellopLiquidDebitTM, ksADKUEngineFreq, wellopPumpFreqTm
Конфигурационный файл макроса
Конфигурационный файл макроса должен быть размещён в распределенном файловом хранилище, путь к которому настраивается в конфигурационном файле OT.REST.
Файл должен содержать только один макрос.
В случае отсутствия аргумента в команде – строка, содержащая одноименный токен, не будет изменена. В случае наличия лишнего аргумента - он будет проигнорирован.
Пример.
../macros/getwell.macros
| readFile format=parquet path=omds_well_adku_v2
| search $wellNum$
| search _time>=$earliest$ AND _time<$latest$
| ``` Джойним номер куста и ID станции управления по ID скважины ```
| join type=inner ID [
| readFile format=parquet path=oms_v5
| fields IDObj, geoNum, Description, IDPad, IDWell
| eval geoPad = if(Description="Pad", geoNum, null)
| eval idKS = if(Description="controlStation", IDObj, null)
| eventstats min(geoPad) as padNum by IDPad
| eventstats min(idKS) as IDKs by IDWell
| search Description="Well" AND ($padNum$)
| rename IDObj as ID
| fields ID, padNum, IDKs ]
| ``` Джойним данные из ШТР по ID скважины ```
| join _time, ID type=outer [
| readFile format=parquet path=omds_well_wellop_v15
| search _time>=$earliest$ AND _time<$latest$
| table _time, ID, wellop* ]
| fields _time, ID, adku*, wellop*
| ``` Джойним данные со станции управления по ID скважины ```
| join _time, IDKs type=outer [
| readFile format=parquet path=omds_ks_v3
| search _time>=$earliest$ AND _time<$latest$
| rename ID as IDKs
| table _time, IDKs, ks* ]
| sort _time
Конфигурационный файл алиасов
Конфигурационный файл алиасов – csv-файл – предназначен для установки соответствия между именами полей в базе данных и названиями столбцов, выводимых в пользовательские таблицы.
Файл размещается в распределенном файловом хранилище.
Макрос использует из csv-файла только имена полей.
Пример:
../macros/names.csv
adkuLiquidDebit,Дебит жидкости,3
adkuWellStatus,ТС Скважины,3
adkuTorLiquidDebit,ТОР. Дебит жидкости,3
adkuGazConsumption,Расход газа,3
Механизм работы
-
Оригинальный запрос попадает на OT.REST.
-
В оригинальном запросе выполняется поиск точек начала работы макросов, выполняется генерация текста запроса с учетом заданных аргументов.
-
Сформированный запрос обрабатывается аналогично обычным поисковым запросам.