Azure Time Series Insights Gen1-Abfragesyntax
Achtung
Dies ist ein Artikel zu Azure Time Series Insights Gen1.
In diesem Artikel werden das Abfrageanforderungsformat und die Syntax für die Azure Time Series Insights Gen1-Abfrage-API beschrieben.
Zusammenfassung
Wichtig
- Abfrageanforderungen müssen im JSON-Format vorliegen.
- HTTP-Anforderungsnutzlasten, die an die Abfrage-API vorgenommen werden, sollten dem in diesem Artikel angegebenen Format entsprechen.
Die Sprache ist in die folgenden Elemente unterteilt:
- Skalare Ausdrücke, die Skalarwerte erzeugen. Skalare Ausdrücke umfassen Prädikatzeichenfolgenausdrücke, Vergleichsausdrücke und arithmetische Ausdrücke.
- Skalare Funktionen, die Skalarwerte zurückgeben.
- Aggregatausdrücke, die verwendet werden, um Auflistungen von Ereignissen zu partitionieren und Measures für die Partitionen zu berechnen.
- Klauseln, die die konstituierenden Komponenten von JSON-Abfragen oder einen Teil eines Ausdrucks bilden.
Datenmodell
Die Azure Time Series Insights Gen1-Abfrage-API arbeitet mit Daten, die als einzelne Ereignisse in einer Umgebung gespeichert werden. Jedes Ereignis ist ein Satz von Eigenschaftsnamen - und Wertpaaren .
Ereigniseigenschaften
Ereigniseigenschaften können einen der folgenden primitiven Typen aufweisen: Bool, DateTime, Double oder String. Alle primitiven Typen können NULL-Werte zulassen.
Hinweis
Benutzerdefinierte Ereignisquellenformate unterstützen möglicherweise einen größeren Satz von Werttypen. Azure Time Series Insights Gen1 leitet den nächstgelegenen primitiven Typ ab und wandelt dann beim Eingang angepasste Typen in sie um.
Alle Ereignisse verfügen über die folgenden integrierten Eigenschaften mit einem vordefinierten Namen und Typ:
Eigenschaftenname | Eigenschaftstyp | Definition |
---|---|---|
$ts | DateTime | Ereigniszeitstempel |
$esn | String | Name der Ereignisquelle |
Ereigniszeitstempel
Standardmäßig wird von der Ereignisquelle ein Ereigniszeitstempelwert bereitgestellt. Beispielsweise würden Ereignisse, die von einem IoT Hub stammen, als Zeitstempel in die Warteschlange eingereiht werden.
Kunden können dieses Verhalten ändern, indem sie stattdessen eine andere Ereigniseigenschaft konfigurieren. Benutzerdefinierte Zeitstempeleigenschaften können in Event Hubs und IoT Hubs angegeben werden.
Name der Ereignisquelle
Der Name der Ereignisquelle ist der Name, der für die Ereignisquelle angezeigt wird, von der Azure Time Series Insights Gen1 das Ereignis empfangen hat. Ereignisquellennamen werden einem bestimmten Ereignis zur Eingangszeit zugeordnet.
Wichtig
- Ereignisquellennamen bleiben für die Lebensdauer des Ereignisses unverändert.
- Wenn der Name einer Ereignisquelle geändert wird, tragen vorhandene Ereignisse den alten Namen der Ereignisquelle. Neue Ereignisse tragen den namen der neuen Ereignisquelle.
Ereignistypen
Benutzerdefinierte Ereigniseigenschaften werden eindeutig identifiziert und in Abfrageausdrücken anhand von Name und Typ referenziert. Ein Ereignis kann mehrere Eigenschaften mit demselben Namen und unterschiedlichen Typen aufweisen. Eigenschaften mit demselben Namen, aber unterschiedlichen Typen können aus der Aufteilung des Eingangstyps resultieren.
Ein Ereigniseigenschaftswert vom Typ String kann in den folgenden Fällen als Eigenschaft mit einem anderen Typ gespeichert werden:
- Wenn ein String-Wert ein gültiger Double-Wert ist, wird er sowohl als Double als auch als String gespeichert.
- Wenn ein String-Wert ein gültiger DateTime-Wert ist, wird er nur als DateTime gespeichert.
Die Abfrage-API konvertiert leere Strings-Literale (""
) null
in die Ausgabe.
Azure Time Series Insights Gen1 verfügt über eingeschränkte Unterstützung für die folgenden Werte innerhalb des Double-Typs: Double.NaN
, Double.PositiveInfinity
und Double.NegativeInfinity
.
Diese Werte werden während des Eingangs in konvertiert null
, aber wenn die Abfrageauswertung einen dieser Werte erzeugt, wird der Wert ausgewertet und als Antwort als Zeichenfolge serialisiert.
Sie können diese Werte als Zeichenfolgen für eingehenden Datenverkehr übergeben. Daher sollten diese Werte in Abfrageausdrücken auch als Zeichenfolgen übergeben werden.
Ereignisschemas beschreiben die Eigenschaften eines Ereignisses. Ein Ereignisschema enthält den Namen einer Ereignisquelle und den geordneten Satz von Eigenschaften für das Ereignis. Verschiedene Ereignisse können unterschiedliche Schemas haben oder dasselbe Schema gemeinsam nutzen.
Skalare Ausdrücke
Skalare Ausdrücke erzeugen skalare Werte. Skalare Ausdrücke werden in die folgenden Arten unterteilt:
- Constant expressions (Konstante Ausdrücke)
- Eigenschaftenverweisausdrücke
- Vergleichsausdrücke
- Arithmetische Ausdrücke
- Prädikatzeichenfolgenausdrücke
Konstante Ausdrücke
Sie stellen konstante Ausdrücke dar, indem Sie die folgenden Literale für jeden der primitiven Typen verwenden:
Primitiver Typ | JSON-Darstellung | JSON-Beispiel | Notizen |
---|---|---|---|
Bool | Als boolescher JSON-Typ |
true , false |
|
DateTime | Als geschachteltes Objekt mit einer einzelnen dateTime-Eigenschaft im ISO 8601-Formatyyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK . |
{"dateTime":"2016-08-01T00:00:00.000Z"} |
|
Double | Eine JSON-Zahl, die in den Double-Bereich umgewandelt wird. |
1.23e45 , 123 |
Doppelte Überläufe generieren einen Fehler. |
String | Ein JSON-Zeichenfolgentyp | "abc" |
|
TimeSpan | Als geschachteltes Objekt mit einer einzelnen timeSpan-Eigenschaft im ISO 8601-Format : P[n]Y[n]M[n]DT[n]H[n]M[n]S . |
{"timeSpan":"P1Y2M3DT4M5.67S"} |
Nullable primitive Typen
Primitive Datentypen können NULL-Werte zulassen.
null
Werte für primitive Typen werden wie folgt in JSON ausgedrückt:
{ "string": null }
{ "double": null }
{ "bool": null }
{ "dateTime": null }
{ "timeSpan": null }
Eigenschaftenverweisausdrücke
Sie verwenden einen Eigenschaftenverweisausdruck , um auf die Werte von nicht integrierten Eigenschaften eines Ereignisses zuzugreifen. Nicht integrierte Eigenschaften enthalten alle benutzerdefinierten Eigenschaften, die über die Standardeigenschaften hinausgehen, die automatisch in einem Ereignisschema enthalten sind.
Der Ergebnistyp eines Eigenschaftenverweisausdrucks ist der primitive Typ der Eigenschaft. Eigenschaften im Ereignisschema werden nach Name und Typ eindeutig identifiziert, und für den Verweisausdruck müssen beide angegeben werden.
JSON-Beispiele:
{ "property": "p1", "type": "Bool" }
{ "property": "p1", "type": "DateTime" }
{ "property": "p1", "type": "Double" }
{ "property": "p1", "type": "String" }
{ "property": "p1", "type": "TimeSpan" }
Ein integrierter Eigenschaftenverweisausdruck wird verwendet, um auf integrierte Eigenschaften eines Ereignisses zuzugreifen. Integrierte Eigenschaften sind nur die Eigenschaften, die automatisch in einem Ereignisschema definiert werden.
Der Ergebnistyp eines integrierten Eigenschaftenverweisausdrucks ist der primitive Typ der Eigenschaft. Auf integrierte Eigenschaften wird nur mit dem Namen verwiesen. Daher ist kein Typ im Verweisausdruck erforderlich:
{ "builtInProperty": "$esn" }
Vergleichsausdrücke
Die folgenden booleschen Vergleichsausdrücke werden unterstützt:
Eigenschaftenname in JSON | BESCHREIBUNG |
---|---|
eq | Gleich |
in | In (gleich jedem) |
phrase | Enthält Einen Ausdruck. |
startsWith | Beginnt mit |
endsWith | Endet mit dem Ausdruck |
regex | Entspricht dem regulären Ausdruck |
lt | Kleiner als |
lte | Kleiner als oder gleich |
gt | Größer als |
Gte | Größer als oder gleich |
Wichtig
- Alle Vergleichsausdrücke verwenden die primitiven Typen von linken und rechten Argumenten und geben einen booleschen Wert zurück, der das Ergebnis des Vergleichs darstellt.
- Beide Typen der linken und rechten Argumente im Vergleich sollten übereinstimmen.
- Alle Typen werden implizit nur in sich selbst umgewandelt, und explizite Umwandlungen werden nicht unterstützt.
{
"eq": {
"left": {
"property": "p1",
"type": "String"
},
"right": "abc"
}
}
JSON-Beispiele:
{ "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" } }
In der folgenden Tabelle werden die unterstützten Argumenttypen für die einzelnen Vergleichsausdrücke aufgeführt:
Argumenttyp | Unterstützte Vergleichsvorgänge |
---|---|
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 |
Das NULL-Literal kann nur mit den folgenden Vergleichsoperatoren verwendet werden: eq oder in.
- Der Eq-Operator führt dazu
true
, dass beide Seiten Werte sindnull
. Andernfalls führt der Operator zufalse
. - Bei anderen Vorgängen wird der Fehler für das NULL-Literal ausgelöst, und das Verhalten ist für NULL-Wert-Eigenschaften undefiniert (jeder Vergleichsvorgang, der zu
false
führt). - Ein
null
-Wert ist in Sortierreihenfolgen vor Werten ungleich NULL (z. B. wenn die Sortierung nach einer Eigenschaft angewendet wird, um eine Liste von Ereignissen zurückzugeben).
Azure Time Series Insights Gen1 unterstützt die folgenden booleschen logischen Ausdrücke:
Eigenschaftenname in JSON | BESCHREIBUNG |
---|---|
and | Akzeptiert einen nicht leeren Satz boolescher Argumente und gibt zurück true , wenn alle als ausgewertet werden true . |
or | Verwendet einen nicht leeren Satz boolescher Argumente und gibt zurück true , wenn eines dieser Argumente als ausgewertet wird true . |
not | Akzeptiert ein einzelnes boolesches Argument und gibt seinen negierten Wert zurück. |
{
"and": [
{
"eq": {
"left": {
"property": "p1",
"type": "String"
},
"right": "abc"
}
},
{
"not": {
"lt": {
"left": {
"property": "p1",
"type": "Double"
},
"right": 1
}
}
}
]
}
Die stringComparison-Eigenschaft ist optional. Der Wert ist OrdinalIgnoreCase
standardmäßig , was dazu führt, dass die Groß- und Kleinschreibung von Sätzen in Vergleichen ignoriert wird.
{
"regex": {
"left": {
"property": "p1",
"type": "String"
},
"right": "^abc*"
}
}
{
"regex": {
"left": "abc",
"right": "^a*$"
}
}
Arithmetische Ausdrücke
Azure Time Series Insights Gen1 unterstützt die folgenden arithmetischen Ausdrücke:
Eigenschaftenname in JSON | BESCHREIBUNG |
---|---|
add | Addition |
sub | Subtraktion |
Mult | Multiplikation |
div | Division |
Alle arithmetischen Ausdrücke verwenden die linken und rechten Argumente von primitiven Typen und geben einen Wert zurück, der das Ergebnis des Vorgangs darstellt.
Alle Typen werden implizit nur in sich selbst umgewandelt, und explizite Umwandlungen werden nicht unterstützt.
{
"add": {
"left": {
"property": "p1",
"type": "Double"
},
"right": 1
}
}
In der folgenden Tabelle werden unterstützte Argumenttypen für die einzelnen arithmetischen Ausdrücke aufgeführt:
Vorgang | Linker Typ | Rechter Typ | Ergebnistyp |
---|---|---|---|
add | Double | Double | Double |
add | TimeSpan | TimeSpan | TimeSpan |
add | DateTime | TimeSpan | DateTime |
add | 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 |
Prädikatzeichenfolgenausdrücke
Boolesche Prädikatzeichenfolgenausdrücke enthalten boolesche Prädikate, die als lesbare Ausdrücke dargestellt werden, die als Prädikatzeichenfolgen bezeichnet werden.
Beispiele für Prädikatzeichenfolgen:
Prädikatszeichenfolge | BESCHREIBUNG |
---|---|
Description HAS 'hello world' |
true für Ereignisse, die den Ausdruck hello world in der Description-Eigenschaft für alle Ereignisquellen enthalten |
'hello world' |
true für Ereignisse, die den Ausdruck enthalten hello world |
startsWith(Status, 'go') |
true für Ereignisse mit Status ab go |
endsWith(Status, 'oD') |
true für Ereignisse, deren Status mit endet od |
startsWith_cs(Status, 'Go') |
true für Ereignisse mit Status ab Go |
endsWith_cs(Status, 'od') |
true für Ereignisse mit Status ab od |
matchesRegex(s, '^G*') |
true für Ereignisse mit Status , die dem regulären Ausdruck entsprechen ^G* |
PointValue.Double = 3.14 |
true für Ereignisse mit doppeltem PointValue gleich 3.14 |
Status IN ('Good','Bad') |
true für Ereignisse mit Status, die oder enthält Good Bad |
PointValue > 3.14 AND Status.String = 'Good' |
true für Ereignisse mit PointValue größer als und 3.14 Zeichenfolge Status von Good |
[PointValue] > 3.14 AND ([Status] = 'Good' OR [Status] = 'Bad') AND NOT [Description] HAS 'hello world' |
true für Ereignisse mit PointValue größer als 3.14 und Status von Good oder Bad und Description , die den Ausdruck nicht enthalten hello world |
{ "predicateString": "PointValue.Double = 3.14" }
Der Ausdruck in der Prädikatzeichenfolge wird in einen booleschen JSON-Ausdruck ausgewertet. Es sollte der folgenden (vereinfachten) Grammatik entsprechen:
JSON Boolean-Ausdruck | Backus-Naur-Form |
---|---|
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 Time Series Insights Primitive Gen1-Datentypen werden in Prädikatzeichenfolgenausdrücken unterstützt.
Im Gegensatz zu JSON-Eigenschaftenverweisausdrücken kann ein Typ für eine Eigenschaft weggelassen werden. In diesem Fall wird automatisch ein Typ abgeleitet.
Unterstützte Literale
Primitiver Typ | Literale |
---|---|
Bool |
TRUE , FALSE |
DateTime | dt'2016-10-08T03:22:55.3031599Z' |
Double |
1.23 , 1.0 |
String | 'abc' |
TimeSpan | ts'P1Y2M3DT4M5.67S' |
NULL |
Unterstützte Operandentypen
Vorgang | Unterstützte Typen | Notizen |
---|---|---|
<, >, <, > | Double, DateTime, TimeSpan | |
=, =, <> | String, Bool, Double, DateTime, TimeSpan, NULL | <> entspricht != |
+, -, *, / | Double, DateTime, TimeSpan | |
IN | String, Bool, Double, DateTime, TimeSpan, NULL | Alle Operanden müssen denselben Typ aufweisen oder eine NULL-Konstante sein. Mehrere NULLs entsprechen einem einzelnen NULL-Wert. |
HAS | String | Im rechten Bereich sind nur konstante Zeichenfolgenliterale zulässig. Leere Zeichenfolge und NULL sind nicht zulässig. |
Für Vergleichsprädikate (<, >, =<,>= , , !=) und das IN-Prädikat operand kann NULL sein oder einen einzelnen Typ aufweisen.
Bei Ausdrücken mit einem HAS-Prädikat kann das konstante Literal auf der rechten Seite des HAS-Operanden in mehrere Typen erweitert werden. Darüber hinaus wird das konstante Literal auf der rechten Seite des HAS-Operanden in einen Bool-, Double-, DateTime- oder TimeSpan-Wert analysiert. Für jeden erfolgreich analysierten Wert wird ein Prädikat mit dem = Operator erstellt. Diese Prädikate und das ursprüngliche HAS-Prädikat werden in ein OR-Prädikat eingebunden. Beispielsweise ist eine Prädikatzeichenfolge p1 HAS '1.0'
gleichbedeutend mit p1.String HAS '1.0' OR p1.Double = 1.0
, wenn p1-Eigenschaften mit den Typen String und Double vorhanden sind.
Typüberprüfung
Prädikatausdrücke werden typgeprüft und überprüft, um sicherzustellen, dass der rechte und der linke Typ darin übereinstimmen.
Wichtig
- Wenn die Konstanten links und rechts eines Operanden nicht übereinstimmen, wird ein Fehler ausgelöst.
- Ein Fehler wird auch ausgelöst, wenn ein Vorgang für oder zwischen bestimmten Typen nicht zulässig ist.
Wenn ein Typ für die Eigenschaft angegeben wird, wird eine Typprüfung angewendet:
Jeder Eigenschaftstyp wird für ein NULL-Literal akzeptiert.
Andernfalls sollten linksseitige und rechte Seitentypen übereinstimmen.
Beispiele für die Eigenschaften p1 und p2 des String-Typs sowie die Eigenschaft p3 des Double-Typs werden in der folgenden Tabelle angezeigt:
Prädikatszeichenfolge Ist gültig? Notizen p1.String = 'abc'
Ja p1.String = p2.String
Ja p1.String = NULL
Ja NULL
entspricht jedem linken Seitentyp.p3.Double = 'abc'
Nein Typenkonflikt. p3.Double = p1.String
Nein Typenkonflikt. p1.String HAS 'abc'
Ja p3.Double HAS '1.0'
Ja Zeichenfolgenliteral wurde erfolgreich in einen Double-Wert analysiert.
Wenn ein Typ für die Eigenschaft nicht angegeben wird, aber ein Name angegeben wird, werden die folgenden Schritte ausgeführt:
- Alle Eigenschaften mit einem angegebenen Namen und Typen werden übernommen.
- Operanden auf der linken Seite und rechts sind nach Typ paarweise gruppiert.
- Paare werden mithilfe von AND-Vorgängen verkettet.
Beispiele für die Eigenschaften p1 und p2 der Typen String und Double sowie einige ihrer Entsprechungen werden in der folgenden Tabelle angezeigt:
Prädikatszeichenfolge Entsprechende stark typisierte Prädikatzeichenfolge Notizen p1 = 'abc'
p1.String = 'abc'
p1 = true
Keine p1-Eigenschaft vom Typ Bool, sodass ein fehlender Eigenschaftsfehler ausgegeben wird. p1 = NULL
p1.String = NULL AND p1.Double = NULL
Für NULL
die rechte Seite wird davon ausgegangen, dass alle übereinstimmenden Eigenschaften seinNULL
sollten.p1 != NULL
p1.String != NULL OR p1.Double != NULL
Dies ist eine Inversion des vorherigen Ausdrucks. 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
Dies ist das Äquivalent zu p1 = NULL
.p1 HAS '1.0'
p1.String HAS '1.0' OR p1.Double = 1.0
Das Zeichenfolgenliteral wurde erfolgreich auf einen gültigen Double-Wert analysiert. p1 HAS 'true'
p1.String HAS 'true'
Das Zeichenfolgenliteral wurde erfolgreich in Bool analysiert, aber kein p1. Die Bool-Eigenschaft ist vorhanden. p1 = p2
p1.String = p2.String AND p1.Double = p2.Double
p1 != p2
p1.String != p2.String OR p1.Double != p2.Double
Dies ist eine Inversion des vorherigen Ausdrucks.
Sowohl der Eigenschaftenname als auch der -Typ können für eine linksseitige Eigenschaft weggelassen werden, wenn der rechtsseitige Eigenschaftentyp klar definiert ist. Dies gilt immer dann, wenn die rechte Seite konstante Literale aufweist und nicht nur ein
NULL
Literal enthält.Dieses Szenario ist eine Generalisierung der Volltextsuche, die den HAS-Operanden verwendet.
Alle Eigenschaften, die dem rechtsseitigen Typ entsprechen, werden übernommen, und die resultierenden Ausdrücke werden über einen OR-Vorgang verkettet.
Beispiele für die Eigenschaft p1 des String - und Double-Typs sowie der Eigenschaft p2 der String - und DateTime-Typen werden in der folgenden Tabelle angezeigt:
Prädikatszeichenfolge Entsprechende stark typisierte Prädikatzeichenfolge Notizen = 'abc'
p1.String = 'abc' OR p2.String = 'abc'
!= 'abc'
p1.String != 'abc' AND p2.String != 'abc'
Inversion des vorherigen Ausdrucks = 1.0
p1.Double = 1.0
= dt'2000-01-02T03:04:05'
p2.DateTime = dt'2000-01-02T03:04:05'
= true
Fehler. Es ist keine Bool-Eigenschaft vorhanden, sodass ein Fehlender Eigenschaftsfehler ausgegeben wird. = NULL
Fehler. Das Weglassen des Eigenschaftennamens für NULL
die rechte Seite ist nicht zulässig.IN (NULL)
Identisch mit dem vorherigen Fehler. 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'
Es gibt keine Eigenschaft vom Typ Bool.
Wenn der Operator zusammen mit einem Eigenschaftennamen ausgelassen wird, wird der
HAS
Vorgang angenommen.
Skalarfunktionen
Skalare Funktionen geben skalare Werte zurück.
Native Funktionen
Zu den skalaren Funktionen, die von Azure Time Series Insights Gen1 sofort unterstützt werden, gehören:
Funktionsname | Rückgabewert | Argumente | Beispiel | Notizen |
---|---|---|---|---|
utcNow | DateTime | Keine | utcNow() | Gibt die aktuelle Uhrzeit im UTC-Format zurück. Beim Funktionsnamen wird die Groß-/Kleinschreibung beachtet. |
Die UTC now-Funktion gibt einen DateTime-Wert zurück, der die aktuelle Uhrzeit im UTC-Format enthält. Es akzeptiert keine Argumente.
Aggregatausdrücke
Aggregatausdrücke werden verwendet, um Auflistungen von Ereignissen zu partitionieren und Measures über die Partitionen zu berechnen. Aggregatausdrücke sind in die folgenden Arten unterteilt:
- Dimensionsausdrücke
- Ausdrücke mit eindeutigen Werten
- Datums histogrammausdrücke
- Messen von Ausdrücken
Dimensionsausdrücke
Sie verwenden Dimensionsausdrücke innerhalb einer Aggregatklausel , um eine Gruppe von Ereignissen zu partitionieren und jeder Partition einen skalaren Schlüssel zuzuweisen.
Dimensionsausdrucktypen:
Eigenschaftenname in JSON | BESCHREIBUNG | Beispiel |
---|---|---|
Uniquevalues | Dimensionswerte im Ergebnis sind exakte Werte einer bestimmten Eigenschaft. | |
dateHistogram | Dimensionswerte im Ergebnis sind Zeitbereiche einer bestimmten Eigenschaft. | Das Datumshistogramm des Zeitstempels kann für eine Suchdauer von 10 Stunden zu einem Bereich von 10 Stunden führen. |
numericHistogram | Dimensionswerte im Ergebnis sind Wertebereiche in einer bestimmten Eigenschaft. | Das numerische Histogramm der Temperatur kann zu einer Rückgabe von 10 Gradbereichen führen. |
Azure Time Series Insights Gen1 beschränkt die maximale Kardinalität oder maximale Gittergröße einer Eingabeaggregatabfrage auf 150.000 Zellen. Um die Kardinalität einer Aggregatabfrage zu berechnen, multiplizieren Sie die Größen aller Dimensionen in der Abfrage. Solange das Produkt kleiner als 150.000 ist, wird die Abfrage für die Ausführung akzeptiert. Wenn das Produkt gleich oder kleiner als 150.000 ist, wird die Abfrage abgelehnt.
Sie geben die maximale Größe einer Dimension an, die von uniqueValues und numericHistogram mithilfe der take-Klausel erzeugt wird. In dateHistogram wird die Größe berechnet, indem die Suchspanne durch die Größe des dateHistogram-Intervalls dividiert wird, das Sie mithilfe der breaks-Klausel angeben.
Bei einer Aggregatabfrage ist beispielsweise die Suchspanne von "2017-11-15T16:00:00.000Z" auf "2017-11-15T19:00:00:00.000Z" = 3 Stunden festgelegt. Wenn die Abfrage dateHistogram mit der breaks-Klausel enthält, die auf 1 Minute (Dimension 1) und uniqueValues über eigenschaft XYZ festgelegt ist, ist die größe der dateHistogram-Dimension 3x60=180. Dies bedeutet, dass uniqueValues bis zu 150.000/180 = 833 Elemente insgesamt in Anspruch nehmen können.
Ausdrücke mit eindeutigen Werten
Sie verwenden einen Ausdruck für eindeutige Werte , um einen Satz von Ereignissen nach den Werten einer angegebenen Ereigniseigenschaft zu gruppieren.
Die Auswertung dieses JSON-Ausdrucks führt zu bis zu 100 Datensätzen, die nach der sensorId
String-Eigenschaft gruppiert werden.
{
"uniqueValues": {
"input": {
"property": "sensorId",
"type": "String"
},
"take": 100
}
}
Datums histogrammausdrücke
Sie verwenden einen Datumshistogrammausdruck , um DateTime-Eigenschaftswerte in Buckets einer angegebenen Größe zu gruppieren.
Eine Auswertung dieses JSON-Ausdrucks führt zu einer Reihe von Timestamp-Datensätzen , die so gerundet sind, dass für jeden Wert Sekunden nulliert sind.
{
"dateHistogram": {
"input": {
"builtInProperty": "$ts"
},
"breaks": {
"size": "1m"
}
}
}
Numerische Histogrammausdrücke
Sie verwenden einen numerischen Histogrammausdruck , um Double-Eigenschaftswerte in einer angegebenen Anzahl von Buckets zu gruppieren.
Eine Auswertung dieses JSON-Ausdrucks führt zu 10 Datensätzen, sodass der Bereich zwischen den Minimal- und Maximalwerten der p1-Eigenschaft in 10 Buckets unterteilt ist.
{
"numericHistogram": {
"input": {
"property": "p1",
"type": "Double"
},
"breaks": {
"count": 10
}
}
}
Measureausdrücke
Sie verwenden Measureausdrücke innerhalb von Aggregatklauseln , um einen skalaren Wert für eine Reihe von Ereignissen zu berechnen. Ein Measureausdruck ist beispielsweise die Berechnung des maximalen Werts, der von einem Temperatursensor während der letzten 24 Stunden gemessen wurde.
Sie verwenden einen Count-Ausdruck , um die Anzahl von Ereignissen in einem entsprechenden Bucket zu berechnen.
{ "count": {} }
Sie verwenden min-, max-, avg- und sum-Ausdrücke , um das Minimum, maximum, den Durchschnitt und die Summe der Werte für eine angegebene Eigenschaft in einem entsprechenden Bucket zu berechnen.
{
"min": {
"input": {
"property": "temperature",
"type": "Double"
}
}
}
Mit dem ersten und letzten Measureausdruck können Sie den Wert einer angegebenen Eigenschaft A abrufen, der dem Minimal- oder Maximalwert der Eigenschaft B entspricht.
{
"first": {
"input": {
"property": "propertyA",
"type": "String"
},
"orderBy": {
"property": "propertyB",
"type": "Double"
}
}
}
{
"last": {
"input": {
"property": "propertyA",
"type": "Double"
},
"orderBy": {
"property": "propertyB",
"type": "DateTime"
}
}
}
Die orderBy-Klausel ist optional und verwendet standardmäßig die Timestamp-Eigenschaft$ts. Die Eingabe kann von einem beliebigen Typ sein. Die orderBy-Klausel unterstützt nur die Typen Double und DateTime .
Wenn Eigenschaft B ein DateTime-Typ ist, erhalten Sie den neuesten oder den frühesten Wert der Eigenschaft A.
Sie können erste und letzte Ausdrücke verwenden, um den frühesten oder neuesten Wert einer bestimmten Eigenschaft zu verstehen. Wenn Sie z. B. eine Eigenschaft namens deviceID
haben und die neueste deviceID
Nachricht verstehen möchten, die ein Ereignis gesendet hat, ist last der effizienteste Ausdrucksoperator, der zum Identifizieren dieser Informationen verwendet werden kann.
{
"last": {
"input": {
"property": "deviceID",
"type": "String"
}
}
}
Ein anderes Beispiel ist die Verwendung von last , um den zuletzt gemeldeten Standort eines bestimmten Objekts zu finden, z. B. ein Schiff, ein Fahrzeug oder ein anderes sich bewegendes Objekt.
Um eine Abfrage zu veranschaulichen, die den letzten bekannten Standort der Schiffe in einer Flotte erzeugt, können Sie eine Abfrage ähnlich der folgenden erstellen:
{
"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"
}
}
}
]
}
]
}
Ein anderes Beispiel besteht darin, zuerst ein Gerät zu finden, das den niedrigsten Druck für jede Anlage meldet:
{
"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"
}
}
}
]
}
]
}
Unterstützung von Dimensions- und Measuretyp
Hier sind die unterstützten Dimensions- und Measureausdrücke basierend auf dem Eigenschaftentyp:
Eigenschaftstyp | Unterstützte Dimensionsausdrücke | Unterstützte Measureausdrücke |
---|---|---|
Bool | "uniqueValues" |
"first" (Eingabe), "last" (Eingabe) |
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" (Eingabe), "last" (Eingabe) |
Klauseln
Klauseln bilden konstituierende Komponenten von JSON-Abfragen oder einen Teil eines Ausdrucks. Klauseln sind in folgende Arten unterteilt:
- Suchspanneklauseln
- Prädikatklauseln
- Einschränken der obersten Klauseln
- Limit take-Klauseln
- Einschränken von Beispielklauseln
- Breaks-Klauseln
- Aggregates-Klauseln
Suchspanneklauseln
Sie verwenden eine Suchspanneklausel , um eine integrierte Timestamp-Eigenschaft eines Ereignisses auf ein bestimmtes Intervall zu filtern. Der Anfang des Intervalls ist inklusive. Das Ende des Intervalls ist exklusiv.
{
"searchSpan": {
"from": {
"dateTime": "2016-08-01T00:00:00.000Z"
},
"to": {
"dateTime": "2016-08-31T00:00:00.000Z"
}
}
}
Die Eigenschaften from und to in der search span-Klausel (searchSpan) sollten gültige Ausdrücke des DateTime-Ergebnistyps sein. Diese Ausdrücke werden vor der Abfrageausführung ausgewertet, was bedeutet, dass sie keine Eigenschaftsverweise enthalten sollten.
Prädikatklauseln
Sie verwenden eine Prädikatklausel , um Ereignisse zu filtern, die das Prädikat erfüllen. Sie sollte in einen booleschen Ausdruck aufgelöst werden.
{
"predicate": {
"eq": {
"left": {
"property": "p1",
"type": "String"
},
"right": "abc"
}
}
}
Das Filtern von Ereignissen bedeutet, ein Prädikat auszuführen, das durch einen booleschen Ausdruck für jedes Ereignis in der Umgebung dargestellt wird. Die Ausführung eines Ausdrucks für ein Ereignis gibt zurück true
, wenn das Ereignis in weitere Vorgänge einbezogen werden muss. Es wird zurückgegeben false
, wenn das Ereignis bei der weiteren Verarbeitung ausgelassen werden muss.
Hinweis
Ereignisse werden immer nach Suchspanne gefiltert, zusätzlich zu allen Filtern, die in einem Prädikatausdruck angegeben sind.
Einschränken der obersten Klauseln
Sie verwenden eine *limit top-Klausel , um eine angegebene Anzahl von Werten in aufsteigender oder absteigender Reihenfolge abzurufen. Die Anzahl der Werte ist gemäß der angegebenen Anzahl begrenzt.
{
"sort": [
{
"input": {
"builtInProperty": "$ts"
},
"order": "Asc"
}
],
"count": 10
}
Limit take-Klauseln
Sie können eine limit take-Klausel als schnelle Möglichkeit verwenden, um einen Satz von Werten in keiner bestimmten Reihenfolge abzurufen. Die Anzahl der zurückgegebenen Werte wird durch die angegebene Eingabe begrenzt.
{ "take": 10 }
Einschränken von Beispielklauseln
Sie verwenden eine *limit sample-Klausel , um eine statistisch repräsentative Stichprobe aus einem Satz von Werten abzurufen. Die Anzahl der zurückgegebenen Werte wird durch die angegebene Eingabe begrenzt.
{ "sample": 10 }
Breaks-Klauseln
Sie verwenden eine *breaks-Klausel in Histogrammausdrücken, um anzugeben, wie ein Bereich geteilt werden soll.
Für Datumshistogramme sollten Sie die Größe des datetime-Intervalls und der Intervallgrenzen angeben. Sie tun dies, es sei denn, das Histogramm basiert auf einer integrierten Timestamp-Eigenschaft , bei der die Grenzen basierend auf der Suchspanne bestimmt werden:
- Intervallgrenzen sind optional und können verwendet werden. Sie können sie beispielsweise verwenden, wenn sie basierend auf einer Suchspanne bestimmt werden, wenn Intervallgrenzen weggelassen werden.
- Für numerische Histogramme sollten Sie die Anzahl der Unterbrechungen angeben. Sie bestimmen Intervallgrenzen basierend auf den minimalen und maximalen Werten einer Eigenschaft.
{
"breaks": {
"size": "1d",
"from": "2000-01-02T03:04:05.0000000",
"to": "2000-01-02T03:04:05.0000000"
}
}
{
"breaks": {
"count": 10
}
}
Aggregates-Klauseln
Sie verwenden eine aggregates-Klausel , um eine Reihe von Ereignissen durch eine bestimmte Eigenschaft zu partitionieren, während Sie die Werte anderer Ereigniseigenschaften messen.
Measures werden für jede Partition ausgewertet, die vom Dimensionsausdruck erzeugt wird.
Im folgenden JSON-Beispiel werden die durchschnitts-, minimalen und maximalen Temperaturen pro Sensor-ID berechnet.
{ "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" } } } ] } ] }
Hinweis
Eine aggregates-Klausel ist ein Array, mit dem Sie mehr als eine Aggregation auf der obersten Ebene angeben können.
Im folgenden JSON-Beispiel wird die durchschnittliche Temperatur pro Stadt und Hersteller unabhängig berechnet:
{ "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" } } } ] } ] }
Hinweis
- Mehrere Elemente in einem Aggregatarray werden derzeit nicht unterstützt.
- Eine Aggregationsdefinition kann jedoch ein geschachteltes Array enthalten, das ein flexibleres, mehrdimensionales Gitter angibt.
Im folgenden JSON-Beispiel wird die durchschnittliche Temperatur pro Sensor-ID pro Minute berechnet.
{ "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" } } } ] } } ] }
Weitere Informationen
Weitere Informationen zu den Azure Time Series Insights Gen1-APIs finden Sie unter Gen1-APIs.
Informationen zu Anforderungs- und Authentifizierungsparametern finden Sie unter Authentifizierung und Autorisierung.
Weitere Informationen zu Azure Time Series Insights Gen1 finden Sie in der Gen1-Dokumentation.