Синтаксис запросов Аналитика временных рядов Azure 1-го поколения

Внимание!

Эта статья посвящена службе "Аналитика временных рядов Azure" 1-го поколения.

В этой статье описывается формат и синтаксис запроса для API запросов Аналитика временных рядов Azure 1-го поколения.

Сводка

Важно!

  • Запросы должны быть в формате JSON.
  • Полезные данные HTTP-запросов, выполненные в API запросов , должны соответствовать формату, указанному в этой статье.

Язык подразделяется на следующие элементы:

Модель данных

API запросов Аналитика временных рядов Azure 1-го поколения работает с данными, которые хранятся в виде отдельных событий в среде. Каждое событие представляет собой набор пар имени свойства и значения .

Свойства события

Свойства события могут иметь один из следующих примитивных типов: Bool, DateTime, Double или String. Все примитивные типы допускает значение NULL.

Примечание

Настраиваемые форматы источников событий могут поддерживать больший набор типов значений. Аналитика временных рядов Azure 1-го поколения определяет ближайший примитивный тип, а затем приводит к ним настраиваемые типы при входе.

Все события имеют следующие встроенные свойства с предопределенным именем и типом:

Имя свойства Тип свойства Определение
$ts DateTime Метка времени события
$esn String Имя источника события
  • Метка времени события

    По умолчанию значение метки времени события предоставляется источником событий. Например, события, поступающие из Центра Интернета вещей, будут иметь время постановки в очередь в качестве метки времени.

    Клиенты могут изменить это поведение, настроив другое свойство события. Настраиваемые свойства метки времени можно указать в центрах событий и Центрах Интернета вещей.

  • Имя источника события

    Имя источника события — это имя, отображаемое для источника событий, из которого Аналитика временных рядов Azure 1-го поколения получил событие. Имена источников событий связаны с определенным событием во время входящего трафика.

    Важно!

    • Имена источников событий остаются неизменными на протяжении всего времени существования события.
    • Если имя источника событий изменяется, существующие события имеют старое имя источника событий. Новые события будут содержать новое имя источника событий.

Типы событий

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

Значение свойства события типа String можно сохранить как свойство с другим типом в следующих случаях:

  • Если значение String является допустимым значением Double , оно хранится как Double и String.
  • Если строковое значение является допустимым значением DateTime , оно сохраняется только как DateTime .

API запросов преобразует пустые строковые литералы ("") null в в выходных данных.

Аналитика временных рядов Azure 1-го поколения имеет ограниченную поддержку следующих значений в типе Double: Double.NaN, Double.PositiveInfinityи Double.NegativeInfinity. Эти значения преобразуются null в во время входящего трафика, но если при вычислении запроса создается одно из этих значений, значение вычисляется и сериализуется как строка в ответе.

Эти значения можно передать как строки для входящего трафика, поэтому в выражениях запроса эти значения также должны передаваться как строки.

Схемы событий описывают свойства события. Схема события содержит имя источника событий и упорядоченный набор свойств события. Разные события могут иметь разные схемы или совместно использовать одну и ту же схему.

Скалярные выражения

Скалярные выражения создают скалярные значения. Скалярные выражения делятся на следующие виды:

Константные выражения

Для представления константных выражений используются следующие литералы для каждого из примитивных типов:

Тип-примитив Представление JSON Пример JSON-файла Примечания
Bool Как логический тип JSON true, false
DateTime Как вложенный объект с одним свойством dateTime в формате yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFKISO 8601 . {"dateTime":"2016-08-01T00:00:00.000Z"}
Double Число JSON, приведение к диапазону Double. 1.23e45, 123 При двойном переполнении возникает ошибка.
String Строковый тип JSON "abc"
TimeSpan Как вложенный объект с одним свойством timeSpan в формате ISO 8601 : P[n]Y[n]M[n]DT[n]H[n]M[n]S. {"timeSpan":"P1Y2M3DT4M5.67S"}

Примитивные типы, допускаемые значение NULL

Примитивные типы данных допускает значение NULL. null Значения для примитивных типов выражаются в формате JSON следующим образом:

{ "string": null }
{ "double": null }
{ "bool": null }
{ "dateTime": null }
{ "timeSpan": null }

Выражения ссылки на свойства

Выражение ссылки на свойство используется для доступа к значениям не встроенных свойств события. К не встроенным свойствам относятся любые настраиваемые свойства, кроме свойств по умолчанию, которые автоматически содержатся в схеме событий.

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

  • Примеры JSON:

    {
       "property": "p1",
       "type": "Bool"
    }
    
    {
       "property": "p1",
       "type": "DateTime"
    }
    
    {
       "property": "p1",
       "type": "Double"
    }
    
    {
       "property": "p1",
       "type": "String"
    }
    
    {
       "property": "p1",
       "type": "TimeSpan"
    }
    

Встроенное выражение ссылки на свойства используется для доступа к встроенным свойствам события. Встроенные свойства — это только те свойства, которые автоматически определяются в схеме событий.

Тип результата встроенного выражения ссылки на свойство является примитивным типом свойства. На встроенные свойства ссылается только имя; Поэтому в ссылочных выражениях тип не требуется:

{ "builtInProperty": "$esn" }

Выражения сравнения

Поддерживаются следующие выражения логического сравнения :

Имя свойства в JSON Описание
eq Равно
in In (равно любой)
phrase Содержит фразу
startsWith Начинается с
endsWith Заканчивается фразой
Regex Соответствует регулярному выражению
lt Меньше чем
Lte Меньше или равно
gt Больше чем
Гтэ Больше или равно

Важно!

  • Все выражения сравнения принимают примитивные типы как левых, так и правых аргументов и возвращают логическое значение, представляющее результат сравнения.
  • Оба типа аргументов левой и правой руки в сравнениях должны совпадать.
  • Все типы неявно приведены только к себе, и явные приведения не поддерживаются.
{
  "eq": {
    "left": {
      "property": "p1",
      "type": "String"
     },
     "right": "abc"
  }
}
  • Примеры JSON:

    {
       "startsWith": {
         "left": {
           "property": "p1",
           "type": "String"
          },
          "right": "abc"
       }
    }
    
    {
       "startsWith": {
         "left": {
           "property": "p1",
           "type": "String"
         },
         "right": "",
         "stringComparison": "Ordinal"
       }
    }
    
    {
       "endsWith": {
         "left": {
           "property": "p1",
           "type": "String"
         },
         "right": {
           "property": "p2",
           "type": "String"
         },
         "stringComparison": "Ordinal"
       }
    }
    

В следующей таблице показаны поддерживаемые типы аргументов для каждого выражения сравнения.

Тип аргумента Поддерживаемая операция сравнения
Bool eq, in
DateTime eq, in, lt, lte, gt, gte
Double eq, in, lt, lte, gt, gte
String eq, in, phrase, startsWith, endsWith, regex
TimeSpan eq, in, lt, lte, gt, gte

Литерал NULL можно использовать только со следующими операторами сравнения: eq или in.

  • Оператор eq приводит к значению , true если обе стороны являются значениями null . В противном случае оператор возвращает значение false.
  • Для других операций возникает ошибка для литерала NULL , а поведение не определено для свойств со значением NULL (любая операция сравнения, которая приводит к false).
  • Значение null предшествует значениям, отличным от NULL, в порядках сортировки (например, если сортировка по свойству применяется для возврата списка событий).

Аналитика временных рядов Azure 1-го поколения поддерживает следующие логические выражения:

Имя свойства в JSON Описание
and (и); Принимает непустой набор логических аргументов и возвращает значение true , если все они имеют значение true.
или диспетчер конфигурации служб Принимает непустой набор логических аргументов и возвращает значение true , если какой-либо из них имеет значение true.
not (не); Принимает один логический аргумент и возвращает его отрицаемое значение.
{
  "and": [
    {
      "eq": {
        "left": {
          "property": "p1",
          "type": "String"
        },
        "right": "abc"
      }
    },
    {
      "not": {
        "lt": {
          "left": {
            "property": "p1",
            "type": "Double"
          },
          "right": 1
        }
      }
    }
  ]
}

Свойство stringComparison является необязательным. По умолчанию его значение равно OrdinalIgnoreCase, что приводит к тому, что регистр предложений игнорируется при сравнении.

{
  "regex": {
    "left": {
      "property": "p1",
      "type": "String"
    },
    "right": "^abc*"
  }
}
{
  "regex": {
      "left": "abc",
      "right": "^a*$"
  }
}

Арифметические выражения

Аналитика временных рядов Azure 1-го поколения поддерживает следующие арифметические выражения:

Имя свойства в JSON Описание
добавление Сложение
sub Вычитание
Мульт Умножение
div Отдел

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

Все типы неявно приведены только к себе, и явные приведения не поддерживаются.

{
  "add": {
    "left": {
      "property": "p1",
      "type": "Double"
     },
     "right": 1
  }
}

В следующей таблице показаны поддерживаемые типы аргументов для каждого из арифметических выражений.

Операция Тип слева Правильный тип Тип результата
добавление Double Double Double
добавление TimeSpan TimeSpan TimeSpan
добавление DateTime TimeSpan DateTime
добавление TimeSpan DateTime DateTime
sub Double Double Double
sub TimeSpan TimeSpan TimeSpan
sub DateTime DateTime TimeSpan
sub DateTime TimeSpan DateTime
mul Double Double Double
div Double Double Double

Выражения строки предиката

Строковые выражения логического предиката содержат логические предикаты, представленные в виде удобочитаемых выражений, называемых строками предиката.

Примеры строк предиката:

Строка предиката Описание
Description HAS 'hello world' true для событий, содержащих фразу hello world в свойстве Description во всех источниках событий
'hello world' true для событий, содержащих фразу hello world
startsWith(Status, 'go') true для событий с состоянием, начинающийся с go
endsWith(Status, 'oD') true для событий с состоянием, заканчивающийся на od
startsWith_cs(Status, 'Go') true для событий с состоянием, начинающийся с Go
endsWith_cs(Status, 'od') true для событий с состоянием, начинающийся с od
matchesRegex(s, '^G*') true для событий с состоянием, соответствующим регулярному выражению ^G*
PointValue.Double = 3.14 true для событий с значением double PointValue , равным 3.14
Status IN ('Good','Bad') true для событий с состояниемGood , содержащим или Bad
PointValue > 3.14 AND Status.String = 'Good' trueдля событий с значением3.14 PointValue больше и строковым состояниемGood
[PointValue] > 3.14 AND ([Status] = 'Good' OR [Status] = 'Bad') AND NOT [Description] HAS 'hello world' true для событий с значением PointValue больше 3.14 и состояниемGood или Bad и описанием , не содержащим фразу hello world
{ "predicateString": "PointValue.Double = 3.14" }

Выражение в строке предиката вычисляется в логическое выражение JSON. Он должен соответствовать следующей (упрощенной) грамматике:

Логическое выражение JSON Форма Backus–Naur
parse orPredicate EOF | EOF;
orPredicate andPredicate (Or andPredicate)*;
andPredicate notPredicate (And notPredicate)*;
notPredicate (Not)* predicate;
predicate parenPredicate | comparisonPredicateExtended | hasPredicate | inPredicate;
parenPredicate OpenParen orPredicate CloseParen;
parenExpression OpenParen additiveExpression CloseParen;
comparisonPredicateExtended (ComparisonOp literal) | comparisonPredicate;
comparisonPredicate additiveExpression ComparisonOp additiveExpression;
additiveExpression multiplicativeExpression ((Plus | Minus) multiplicativeExpression)*;
multiplicativeExpression unaryExpression (MultiplicativeOp unaryExpression)*;
functionCallExpression identifier OpenParen CloseParen;
unaryExpression identifier | literal | functionCallExpression | parenPredicate | parenExpression;
hasPredicate (identifier? Has)? StringLiteral;
inPredicate identifier? In OpenParen literal (Comma literal)* CloseParen;
literal StringLiteral | ((Minus)? NumericLiteral) | BooleanLiteral | DateTimeLiteral | TimeSpanLiteral | NullLiteral;
identifier BuiltinIdentifier | (QuotedOrUnquotedIdentifier (Sep QuotedOrUnquotedIdentifier)?);

примитивные типы данных Аналитика временных рядов Azure 1-го поколения поддерживаются в строковых выражениях предиката.

В отличие от выражений ссылок на свойство JSON тип для свойства можно опустить, и в этом случае тип выводится автоматически.

Поддерживаемые литералы

Тип-примитив Литералы
Bool TRUE, FALSE
DateTime dt'2016-10-08T03:22:55.3031599Z'
Double 1.23, 1.0
String 'abc'
TimeSpan ts'P1Y2M3DT4M5.67S'
NULL

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

Операция Поддерживаемые типы Примечания
<, >, <=, >= Double, DateTime, TimeSpan
=, !=, <> String, Bool, Double, DateTime, TimeSpan, NULL <> эквивалентно для !=
+, -, *, / Double, DateTime, TimeSpan
IN String, Bool, Double, DateTime, TimeSpan, NULL Все операнды должны быть одного типа или являться константой NULL. Несколько значений NULLэквивалентны одному значению NULL.
HAS String Справа разрешены только константы строковых литералов. Пустая строка и NULL не допускаются.

Для предикатов сравнения (<, >, <=, >= , =!=) и операнд предиката IN может иметь значение NULL или иметь один тип.

Для выражений с предикатом HAS константный литерал в правой части операнда HAS можно развернуть на несколько типов. Кроме того, константный литерал справа от операнда HAS анализируется в значение Bool, Double, DateTime или TimeSpan . Для каждого успешно проанализированного значения создается предикат с оператором = . Эти предикаты и исходный предикат HAS объединяются в предикат OR . Например, строка p1 HAS '1.0' предиката эквивалентна p1.String HAS '1.0' OR p1.Double = 1.0, если существуют свойства p1 с типами String и Double .

Проверка типа

Выражения предиката проверяются и проверяются, чтобы убедиться, что типы правой и левой рук в них совпадают.

Важно!

  • Если константы слева и справа от операнда не совпадают, возникает ошибка.
  • Ошибка также возникает, если операция не разрешена для определенных типов или между ними.
  • Если для свойства указан тип, применяется проверка типа:

    • Любой тип свойства принимается для литерала NULL .

    • В противном случае типы слева и справа должны совпадать.

      Примеры свойств p1 и p2 типа String и свойства p3 типа Double приведены в следующей таблице:

      Строка предиката Является ли допустимым? Примечания
      p1.String = 'abc' Да
      p1.String = p2.String Да
      p1.String = NULL Да NULL соответствует любому левому типу.
      p3.Double = 'abc' Нет Несоответствие типов.
      p3.Double = p1.String Нет Несоответствие типов.
      p1.String HAS 'abc' Да
      p3.Double HAS '1.0' Да Строковый литерал успешно проанализирован до значения Double .
  • Если для свойства опущен тип, но указано имя, выполняются следующие действия:

    1. Принимаются все свойства с указанным именем и типами.
    2. Операнды слева и справа группируются по парам по типу.
    3. Пары объединяются с помощью операций AND .
    • Примеры свойств p1 и p2 типов String и Double , а также некоторые их эквиваленты приведены в следующей таблице:

      Строка предиката Эквивалентная строка предиката со строгим типом Примечания
      p1 = 'abc' p1.String = 'abc'
      p1 = true Отсутствует свойство p1 типа Bool, поэтому возникает ошибка отсутствующих свойств.
      p1 = NULL p1.String = NULL AND p1.Double = NULL Для NULL правой стороны предполагается, что все соответствующие свойства должны иметь значение NULL.
      p1 != NULL p1.String != NULL OR p1.Double != NULL Это инверсия предыдущего выражения.
      p1 = '1.0' p1.String = '1.0'
      p1 IN (1.0, NULL) p1.Double = 1.0 OR p1.Double = NULL
      p1 IN (NULL) p1.String = NULL AND p1.Double = NULL Это эквивалент .p1 = NULL
      p1 HAS '1.0' p1.String HAS '1.0' OR p1.Double = 1.0 Строковый литерал успешно проанализирован до допустимого значения Double .
      p1 HAS 'true' p1.String HAS 'true' Строковый литерал успешно проанализирован в Bool, но не p1. Свойство Bool существует.
      p1 = p2 p1.String = p2.String AND p1.Double = p2.Double
      p1 != p2 p1.String != p2.String OR p1.Double != p2.Double Это инверсия предыдущего выражения.
  • Имя и тип свойства можно опустить для левого свойства, если тип правого свойства четко определен. Это верно всякий раз, когда правая сторона имеет константные литералы и не содержит только NULL литерал.

    • Этот сценарий представляет собой обобщение полнотекстового поиска, использующего операнд HAS .

    • Принимаются все свойства, соответствующие правому типу, а результирующие выражения объединяются с помощью операции OR .

    • Примеры свойств p1 типов String и Double и свойства p2 типов String и DateTime приведены в следующей таблице:

      Строка предиката Эквивалентная строка предиката строгого типа Примечания
      = 'abc' p1.String = 'abc' OR p2.String = 'abc'
      != 'abc' p1.String != 'abc' AND p2.String != 'abc' Инверсия предыдущего выражения
      = 1.0 p1.Double = 1.0
      = dt'2000-01-02T03:04:05' p2.DateTime = dt'2000-01-02T03:04:05'
      = true Ошибка. Свойство Bool не существует, поэтому возникает ошибка отсутствующего свойства.
      = NULL Ошибка. Пропуск имени свойства для NULL правой стороны не допускается.
      IN (NULL) То же, что и предыдущая ошибка.
      IN (1.0, NULL) p1.Double = 1.0 OR p1.Double = NULL
      HAS '1.0' p1.String HAS '1.0' OR p1.Double = 1.0 OR p2.String HAS '1.0'
      HAS 'true' p1.String HAS 'true' OR p2.String HAS 'true' Свойство с типом Bool отсутствует.
  • Если оператор опущен вместе с именем свойства, HAS предполагается операция.

Скалярные функции

Скалярные функции возвращают скалярные значения.

Собственные функции

Скалярные функции, которые поддерживаются Аналитика временных рядов Azure 1-го поколения, включают:

Имя функции Возвращаемое значение Аргументы Пример Примечания
utcnow DateTime Нет utcNow() Возвращает текущее время в формате UTC. Имя функции учитывает регистр.

Функция UTC now возвращает значение DateTime , содержащее текущее время в формате UTC. Он не принимает никаких аргументов.

Статистические выражения

Статистические выражения используются для секционирования коллекций событий и вычислений мер по секциям. Статистические выражения делятся на следующие типы:

Выражения измерения

Выражения измерений используются в предложении aggregates для секционирования набора событий и назначения скалярного ключа каждой секции.

Типы выражений измерения:

Имя свойства в JSON Описание Пример
uniqueValues Значения измерений в результатах являются точными значениями заданного свойства.
dateHistogram Значения измерений в результатах — это диапазоны времени заданного свойства. Гистограмма даты метки времени может привести к 10 1-часовой диапазону поиска.
numericHistogram Значения измерений в результате представляют собой диапазоны значений в заданном свойстве. Числовая гистограмма температуры может привести к возврату 10 диапазонов градусов.

Аналитика временных рядов Azure 1-го поколения ограничивает максимальную кратность или максимальный размер решетки входного статистического запроса до 150 000 ячеек. Чтобы вычислить кратность агрегатного запроса, необходимо умножить размеры всех измерений в запросе. Если продукт меньше 150 000, запрос принимается для выполнения. Если значение продукта равно или меньше 150 000, запрос отклоняется.

Укажите максимальный размер измерения, создаваемого uniqueValues и numericHistogram , с помощью предложения take . В dateHistogram размер вычисляется путем деления диапазона поиска на размер интервала dateHistogram , который указывается с помощью предложения breaks .

Например, в статистическом запросе задан диапазон поиска от "2017-11-15T16:00:00.000Z" до "2017-11-15T19:00:00.000Z" = 3 часа. Если запрос включает dateHistogram с предложением breaks , задается значение 1 минута (измерение 1) и uniqueValues для свойства XYZ, размер измерения dateHistogram составляет 3x60=180. Это означает, что значение uniqueValue может занять до 150 000/180 = 833 элемента.

Выражения уникальных значений

Выражение уникальных значений используется для группировки набора событий по значениям указанного свойства события.

При вычислении этого выражения JSON можно получить до 100 записей, которые группируются по свойству sensorIdString .

{
  "uniqueValues": {
    "input": {
      "property": "sensorId",
      "type": "String"
    },
    "take": 100
  }
}

Выражения гистограмм даты

Выражение гистограммы даты используется для группировки значений свойств DateTime в контейнеры указанного размера.

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

{
  "dateHistogram": {
    "input": {
      "builtInProperty": "$ts"
    },
    "breaks": {
      "size": "1m"
    }
  }
}

Числовые выражения гистограммы

Для группировки значений свойств Double в указанное число сегментов используется числовое выражение гистограммы.

Вычисление этого выражения JSON приводит к 10 записям, поэтому диапазон между минимальным и максимальным значениями свойства p1 делится на 10 сегментов.

{
  "numericHistogram": {
    "input": {
      "property": "p1",
      "type": "Double"
    },
    "breaks": {
      "count": 10
    }
  }
}

Выражения мер

Выражения мер используются в предложениях агрегатов для вычисления скалярного значения на наборе событий. Например, выражение меры — это вычисление максимального значения, измеренного датчиком температуры за последние 24 часа.

Выражение count используется для вычисления количества событий в соответствующем контейнере.

{ "count": {} }

Выражения min, max, avg и sum используются для вычисления минимального, максимального, среднего и суммарных значений для указанного свойства в соответствующем контейнере.

{
  "min": {
    "input": {
      "property": "temperature",
      "type": "Double"
    }
  }
}

С помощью выражений первой и последней меры можно получить значение указанного свойства A , соответствующее минимальному или максимальному значению свойства B.

{
  "first": {
    "input": {
      "property": "propertyA",
      "type": "String"
    },
    "orderBy": {
      "property": "propertyB",
      "type": "Double"
    }
  }
}
{
  "last": {
    "input": {
      "property": "propertyA",
      "type": "Double"
    },
    "orderBy": {
      "property": "propertyB",
      "type": "DateTime"
    }
  }
}

Предложение orderBy является необязательным. По умолчанию используется свойство Timestamp$ts. Входные данные могут быть любого типа. Предложение orderBy поддерживает только типы Double и DateTime .

Если свойство B является типом DateTime , вы получите последнее или самое раннее значение свойства A.

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

{
  "last": {
    "input": {
      "property": "deviceID",
      "type": "String"
    }
  }
}

Другой пример — использование last для поиска последнего сообщаемого расположения определенного объекта, например корабля, транспортного средства или другого движущегося объекта.

Чтобы проиллюстрировать запрос, который создает последнее известное расположение кораблей в флоте, можно создать запрос, аналогичный следующему:

{
  "searchSpan": {
    "from": "2018-05-05T12:00:00.000Z",
    "to": "2018-05-15T12:01:00.000Z"
  },
  "aggregates": [
     {
       "dimension": {
         "uniqueValues": {
           "input": {
             "property": "shipId",
             "type": "string"
            },
            "take": 150000
          }
        },
        "measures": [
          {
            "last": {
              "input": {
                "property": "Latitude",
                "type": "Double"
              }
           }
        },
        {
          "last": {
            "input": {
              "property": "Longitude",
              "type": "Double"
            }
          }
        }
      ]
    }
  ]
}

Другой пример — сначала найти устройство, которое сообщает о самом низком давлении для каждого завода:

{
  "searchSpan": {
    "from": "2018-05-05T12:00:00.000Z",
    "to": "2018-05-15T12:01:00.000Z"
  },
  "aggregates": [
    {
      "dimension": {
        "uniqueValues": {
          "input": {
            "property": "plantId",
            "type": "String"
          },
          "take": 150000
        }
     },
     "measures": [
       {
         "first": {
           "input": {
             "property": "deviceId",
             "type": "String"
           },
           "orderBy": {
             "property": "pressure",
              "type": "Double"
            }
          }
        }
      ]
    }
  ]
}

Поддержка измерений и типов мер

Ниже приведены поддерживаемые выражения измерения и меры, основанные на типе свойства:

Тип свойства Поддерживаемые выражения измерений Поддерживаемые выражения мер
Bool "uniqueValues" "first" (input), "last" (input)
DateTime "uniqueValues", "dateHistogram" "min", "max", "first" (orderBy, input), "last” (orderBy, input)
Double "uniqueValues", "numericHistogram" "sum", "avg", "min", "max", "first" (orderBy, input), "last” (orderBy, input)
String "uniqueValues" "first" (input), "last" (input)

Предложения

Предложения формируют составные компоненты запросов JSON или часть выражения. Предложения делятся на следующие виды:

Предложения диапазона поиска

Предложение диапазона поиска используется для фильтрации встроенного свойства Timestamp события по заданному интервалу. Начало интервала является инклюзивным. Конец интервала является монопольным.

{
  "searchSpan": {
    "from": {
      "dateTime": "2016-08-01T00:00:00.000Z"
    },
    "to": {
      "dateTime": "2016-08-31T00:00:00.000Z"
    }
  }
}

Свойства from и to в предложении search span (searchSpan) должны быть допустимыми выражениями типа результата DateTime . Эти выражения оцениваются перед выполнением запроса, что означает, что они не должны содержать ссылок на свойства.

Предложения предиката

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

{
  "predicate": {
    "eq": {
      "left": {
        "property": "p1",
        "type": "String"
       },
       "right": "abc"
     }
  }
}

Фильтрация событий означает выполнение предиката, представленного логическим выражением для каждого события в среде. Выполнение выражения в событии возвращает значение true , если событие должно быть включено в дальнейшие операции. Он возвращает значение false , если событие должно быть пропущено из дальнейшей обработки.

Примечание

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

Ограничить верхние предложения

Предложение *limit top используется для получения указанного количества значений в порядке возрастания или убывания. Количество значений ограничено в соответствии с указанным числом.

{
  "sort": [
    {
      "input": {
        "builtInProperty": "$ts"
      },
      "order": "Asc"
    }
  ],
  "count": 10
}

Ограничение предложений take

Предложение limit take можно использовать как быстрый способ получения набора значений в не определенном порядке. Количество возвращаемых значений ограничено указанными входными данными.

{ "take": 10 }

Ограничение примеров предложений

Предложение *limit sample используется для получения статистически репрезентативной выборки из набора значений. Количество возвращаемых значений ограничено указанными входными данными.

{ "sample": 10 }

Предложения прерываний

Предложение *breaks используется в выражениях гистограммы, чтобы указать способ деления диапазона.

Для гистограмм даты следует указать размер интервала даты и времени и границ интервала. Это можно сделать, если гистограмма не основана на встроенном свойстве Timestamp , границы которого определяются на основе диапазона поиска:

  • Границы интервала являются необязательными и могут использоваться. Например, их можно использовать, если они определяются на основе диапазона поиска, если границы интервалов опущены.
  • Для числовых гистограмм следует указать количество разрывов. Границы интервалов определяются на основе минимальных и максимальных значений свойства.
{
  "breaks": {
    "size": "1d",
    "from": "2000-01-02T03:04:05.0000000",
    "to": "2000-01-02T03:04:05.0000000"
  }
}
{
  "breaks": {
    "count": 10
  }
}

Предложения статистических выражений

Предложение aggregates используется для секционирования набора событий по заданному свойству при измерении значений других свойств событий.

Меры оцениваются в каждой секции, созданной выражением измерения.

  • В следующем примере JSON вычисляется средняя, минимальная и максимальная температура на идентификатор датчика.

    {
      "aggregates": [
        {
          "dimension": {
            "uniqueValues": {
              "input": {
                "property": "sensorId",
                "type": "String"
              },
              "take": 100
            }
          },
          "measures": [
            {
              "avg": {
                "input": {
                  "property": "temperature",
                  "type": "Double"
                }
              }
            },
            {
              "min": {
                "input": {
                  "property": "temperature",
                  "type": "Double"
                }
              }
            },
            {
              "max": {
                "input": {
                  "property": "temperature",
                  "type": "Double"
                }
              }
            }
          ]
        }
      ]
    }
    

    Примечание

    Предложение aggregates — это массив, который позволяет указать несколько агрегатов на самом верхнем уровне.

  • В следующем примере JSON вычисляется средняя температура для каждого города и производителя независимо друг от друга:

    {
      "aggregates": [
        {
          "dimension": {
            "uniqueValues": {
              "input": {
                "property": "city",
                "type": "String"
              },
              "take": 100
            }
          },
          "measures": [
            {
              "avg": {
                "input": {
                  "property": "temperature",
                  "type": "Double"
                }
              }
            }
          ]
        },
        {
          "dimension": {
            "uniqueValues": {
              "input": {
                "property": "manufacturer",
                "type": "String"
              },
              "take": 100
            }
          },
          "measures": [
            {
              "avg": {
                "input": {
                  "property": "temperature",
                  "type": "Double"
                }
              }
            }
          ]
        }
      ]
    }
    

    Примечание

    • Наличие более одного элемента в массиве агрегатов в настоящее время не поддерживается.
    • Однако определение агрегирования может включать вложенный массив, который задает более гибкую многомерную решетку.
  • В следующем примере JSON вычисляется средняя температура на идентификатор датчика в минуту.

    {
      "aggregates": [
        {
          "dimension": {
            "uniqueValues": {
              "input": {
                "property": "sensorId",
                "type": "String"
              },
              "take": 100
            }
          },
          "aggregate": {
            "dimension": {
              "dateHistogram": {
                "input": {
                  "builtInProperty": "$ts"
                },
                "breaks": {
                  "size": "1m"
                }
              }
            },
            "measures": [
              {
                "avg": {
                  "input": {
                    "property": "temperature",
                    "type": "Double"
                  }
                }
              }
            ]
          }
        }
      ]
    }
    

См. также раздел