Teilen über


Konvertieren von Daten mithilfe von Dataflowkonvertierungen

Wichtig

Die von Azure Arc aktivierte Azure IoT Operations Preview befindet sich derzeit in der VORSCHAU. Sie sollten diese Vorschausoftware nicht in Produktionsumgebungen verwenden.

Sie müssen eine neue Installation von Azure IoT Einsatz bereitstellen, wenn ein allgemein verfügbares Release verfügbar ist. Sie können keine Installation der Vorschauversion upgraden.

Die zusätzlichen Nutzungsbestimmungen für Microsoft Azure-Vorschauen enthalten rechtliche Bedingungen. Sie gelten für diejenigen Azure-Features, die sich in der Beta- oder Vorschauversion befinden oder aber anderweitig noch nicht zur allgemeinen Verfügbarkeit freigegeben sind.

Sie können Dataflowkonvertierungen verwenden, um Daten in Azure IoT Einsatz zu transformieren. In einem Dataflow wird das Element für die Konvertierung verwendet, um Werte für Ausgabefelder zu berechnen. Sie können in Dataflowkonvertierungen Eingabefelder, verfügbare Vorgänge, Datentypen und Typkonvertierungen verwenden.

Das Dataflowelement für die Konvertierung wird verwendet, um Werte für Ausgabefelder zu berechnen:

- inputs:
  - *.Max   # - $1
  - *.Min   # - $2
  output: ColorProperties.*
  expression: ($1 + $2) / 2

Für Konvertierungen sind mehrere Aspekte relevant:

  • Verweis auf Eingabefelder: Diese verweisen in der Konvertierungsformel auf Werte aus Eingabefeldern.
  • Verfügbare Vorgänge: Diese können in Konvertierungen verwendet werden. Beispiel: Addition, Subtraktion, Multiplikation und Division.
  • Datentypen: Diese können von einer Formel verarbeitet und bearbeitet werden. Beispiel: ganze Zahl, Gleitkommazahl, Zeichenfolge.
  • Typkonvertierungen: Diese bestimmen, wie Datentypen zwischen den Werten der Eingabefelder, der Formelauswertung und den Ausgabefeldern konvertiert werden.

Eingabefelder

In Konvertierungen können Formeln statische Werte wie die Zahl 25 oder Parameter verarbeiten, die von Eingabefeldern abgeleitet wurden. Eine Zuordnung definiert diese Eingabefelder, auf die die Formel zugreifen kann. Auf jedes Feld wird gemäß seiner Reihenfolge in der Eingabeliste verwiesen:

- inputs:
  - *.Max        # - $1
  - *.Min        # - $2
  - *.Mid.Avg    # - $3
  - *.Mid.Mean   # - $4
  output: ColorProperties.*
  expression: ($1, $2, $3, $4)

In diesem Beispiel führt die Konvertierung zu einem Array, das die Werte von [Max, Min, Mid.Avg, Mid.Mean] enthält. Die Kommentare in der YAML-Datei (# - $1, # - $2) sind optional, sie veranschaulichen jedoch die Verbindung zwischen den einzelnen Feldeigenschaften und deren Rolle in der Konvertierungsformel.

Datentypen

Unterschiedliche Serialisierungsformate unterstützen verschiedene Datentypen. JSON bietet beispielsweise einige Grundtypen: Zeichenfolge, Zahl, boolescher Wert und NULL. Ebenfalls enthalten sind Arrays dieser primitiver Typen. Im Gegensatz dazu weisen andere Serialisierungsformate wie Avro ein komplexeres Typsystem auf, einschließlich ganzer Zahlen mit mehreren Bitfeldlängen und Zeitstempeln mit unterschiedlichen Auflösungen. Beispiel: Millisekunden und Mikrosekunden.

Wenn der Mapper eine Eingabeeigenschaft liest, wird diese in einen internen Typ konvertiert. Diese Konvertierung ist erforderlich, um die Daten im Arbeitsspeicher zu speichern, bis sie in ein Ausgabefeld geschrieben werden. Die Konvertierung in einen internen Typ erfolgt unabhängig davon, ob die Serialisierungsformate der Ein- und Ausgabe identisch sind.

Die interne Darstellung verwendet die folgenden Datentypen:

Typ Beschreibung
bool Logischer TRUE-/FALSE-Wert
integer Als signierte ganze 128-Bit-Zahl gespeichert
float Als 64-Bit-Gleitkommazahl gespeichert
Zeichenfolge UTF-8-Zeichenfolge
Byte Binäre Daten, eine Zeichenfolge mit nicht signierten 8-Bit-Werten
Datum/Uhrzeit UTC oder Ortszeit mit Nanosekundenauflösung
time Tageszeit mit Nanosekundenauflösung
duration Dauer mit Nanosekundenauflösung
array Array aller zuvor aufgeführten Typen
Karte Vektor von Schlüssel-Wert-Paaren aller zuvor aufgeführten Typen

Eingabedatensatzfelder

Beim Lesen eines Eingabedatensatzfelds wird der zugrunde liegende Typ in eine dieser internen Typvarianten konvertiert. Die interne Darstellung ist so vielseitig, dass die meisten Eingabetypen mit minimaler oder keiner Konvertierung verarbeitet werden können. Einige Eingabetypen erfordern jedoch eine Konvertierung oder werden nicht unterstützt. Einige Beispiele:

  • Der UUID-Typ von Avro wird in eine Zeichenfolge konvertiert, da in der internen Darstellung kein spezifischer UUID-Typ vorhanden ist.
  • Der Dezimaltyp von Avro wird vom Mapper nicht unterstützt, daher können Felder dieses Typs nicht in Zuordnungen einbezogen werden.
  • Die Konvertierung des Dauertyps von Avro kann variieren. Wenn das Feld für Monate festgelegt ist, wird es nicht unterstützt. Wenn lediglich Tage und Millisekunden festgelegt sind, wird es in die interne Darstellung für Dauer konvertiert.

Bei einigen Formaten werden Ersatztypen verwendet. Beispiel: JSON verfügt nicht über einen Typ für Datum/Uhrzeit und speichert stattdessen Werte von Datum/Uhrzeit als Zeichenfolgen, die nach ISO 8601 formatiert sind. Wenn der Mapper ein solches Feld liest, bleibt die interne Darstellung eine Zeichenfolge.

Ausgabedatensatzfelder

Der Mapper ist flexibel konzipiert und konvertiert interne Typen in Ausgabetypen, um Daten einzuschließen, die aus einem Serialisierungsformat mit einem begrenzten Typsystem stammen. Im folgenden Abschnitt sind einige Beispiele für die Verarbeitung von Konvertierungen aufgeführt:

  • Numerische Typen: Diese können in andere Darstellungen konvertiert werden, wenngleich dabei ein Genauigkeitsverlust entsteht. Beispiel: Eine 64-Bit-Gleitkommazahl (f64) kann in eine ganze 32-Bit-Zahl (i32) konvertiert werden.
  • Zeichenfolgen in Zahlen: Wenn der eingehende Datensatz eine Zeichenfolge wie 123 enthält und das Ausgabefeld eine ganze 32-Bit-Zahl ist, konvertiert der Mapper den Wert und schreibt ihn als Zahl.
  • Zeichenfolgen in andere Typen:
    • Wenn das Ausgabefeld den Typ Datum/Uhrzeit aufweist, versucht der Mapper, die Zeichenfolge als einen nach ISO 8601 formatierten Typ für Datum/Uhrzeit zu parsen.
    • Wenn das Ausgabefeld den Typ Binär/Bytes aufweist, versucht der Mapper, die Zeichenfolge aus einer Base64-codierten Zeichenfolge zu deserialisieren.
  • Boolesche Werte:
    • Diese werden in 0/1 konvertiert, wenn das Ausgabefeld numerisch ist.
    • Diese werden in TRUE/FALSE konvertiert, wenn das Ausgabefeld eine Zeichenfolge ist.

Explizite Typkonvertierungen

Während die automatischen Konvertierungen basierend auf gängigen Implementierungsmethoden erwartungsgemäß funktionieren, gibt es Instanzen, in denen die korrekte Konvertierung nicht automatisch bestimmt werden kann und zu dem Fehler Nicht unterstützt führt. Für diese Situationen stehen mehrere Konvertierungsfunktionen zur Verfügung, um explizit zu definieren, wie Daten transformiert werden sollen. Diese Funktionen bieten mehr Kontrolle darüber, wie Daten konvertiert werden. Außerdem stellen sie sicher, dass die Datenintegrität aufrecht erhalten wird, selbst wenn automatische Methoden nicht ausreichen.

Verwenden einer Konvertierungsformel mit Typen

In Zuordnungen kann eine optionale Formel angeben, wie Daten aus der Eingabe verarbeitet werden, bevor diese in das Ausgabefeld geschrieben werden. Ist keine Formel angegeben, kopiert der Mapper mithilfe der internen Typ- und Konvertierungsregeln das Eingabefeld in die Ausgabe.

Ist eine Formel angegeben, sind die für die Verwendung in Formeln verfügbaren Datentypen auf die folgenden beschränkt:

  • Ganze Zahlen
  • Gleitkommazahlen
  • Zeichenfolgen
  • Boolesche Werte
  • Arrays der oben genannten Typen
  • Fehlender Wert

Zuordnung und Byte können in Formeln nicht verwendet werden.

Typen im Zusammenhang mit der Zeit (Datum/Uhrzeit, Uhrzeit und Dauer) werden in ganzzahlige Werte konvertiert, die die Zeit in Sekunden darstellen. Nach der Formelauswertung werden die Ergebnisse in der internen Darstellung gespeichert und nicht erneut konvertiert. Beispiel: Der Typ Datum/Uhrzeit bleibt nach der Konvertierung in Sekunden eine ganze Zahl. Wenn der Wert in Feldern für Datum/Uhrzeit verwendet werden soll, muss eine explizite Konvertierungsmethode angewendet werden. Beispiel: Der Wert wird in eine Zeichenfolge nach ISO 8601 konvertiert, die automatisch in den Typ Datum/Uhrzeit des Serialisierungsformats für die Ausgabe konvertiert wird.

Verwenden unregelmäßiger Typen

Besondere Überlegungen gelten für Typen wie Arrays und Fehlender Wert:

Arrays

Arrays können mithilfe von Aggregationsfunktionen verarbeitet werden, um einen einzelnen Wert aus mehreren Elementen zu berechnen. Beispielsweise mithilfe des Eingabedatensatzes:

{
    "Measurements": [2.34, 12.3, 32.4]
}

Mit der Zuordnung:

- inputs:
  - Measurements # - $1
  output: Measurement
  expression: min($1)

Bei dieser Konfiguration wird der kleinste Wert aus dem Array Measurements für das Ausgabefeld ausgewählt.

Es ist ebenfalls möglich, Funktionen zu verwenden, die zu einem neuen Array führen:

- inputs:
  - Measurements # - $1
  output: Measurements
  expression: take($1, 10)  # taking at max 10 items

Arrays können zudem aus mehreren einzelnen Werten erstellt werden:

- inputs:
  - minimum  # - - $1
  - maximum  # - - $2
  - average  # - - $3
  - mean     # - - $4
  output: stats
  expression: ($1, $2, $3, $4)

Diese Zuordnung erstellt ein Array mit dem Mindest-, Höchst-, Durchschnitts- und Mittelwert.

Fehlender Wert

Bei Fehlender Wert handelt es sich um einen speziellen Typ, der in den folgenden Szenarios verwendet wird:

  • Umgang mit fehlenden Feldern in der Eingabe durch Bereitstellen eines alternativen Werts
  • Bedingtes Entfernen eines Felds basierend auf seiner Existenz

Beispielzuordnung mithilfe des fehlenden Werts:

{
    "Employment": {      
      "Position": "Analyst",
      "BaseSalary": 75000,
      "WorkingHours": "Regular"
    }
}

Der Eingabedatensatz enthält das Feld BaseSalary, das jedoch möglicherweise optional ist. Angenommen, ein Wert muss aus einem Kontextualisierungsdataset hinzugefügt werden, wenn das Feld fehlt:

{
  "Position": "Analyst",
  "BaseSalary": 70000,
  "WorkingHours": "Regular"
}

Eine Zuordnung kann überprüfen, ob das Feld im Eingabedatensatz vorhanden ist. Wenn das Feld gefunden wird, erhält die Ausgabe diesen vorhandenen Wert. Andernfalls erhält die Ausgabe den Wert aus dem context-Dataset. Zum Beispiel:

- inputs:
  - BaseSalary  # - - - - - - - - - - $1
  - $context(position).BaseSalary #  - $2 
  output: BaseSalary
  expression: if($1 == (), $2, $1)

conversion verwendet die if-Funktion mit drei Parametern:

  • Der erste Parameter ist eine Bedingung. Im Beispiel wird überprüft, ob es sich bei dem BaseSalary-Feld des Eingabefelds (mit dem Alias $1) um den fehlenden Wert handelt.
  • Der zweite Parameter ist das Ergebnis der Funktion, wenn die Bedingung im ersten Parameter TRUE ist. In diesem Beispiel ist er das BaseSalary-Feld des Kontextualisierungsdatasets (mit dem Alias $2).
  • Der dritte Parameter ist der Wert für die Bedingung, wenn der erste Parameter FALSE ist.

Verfügbare Funktionen

Funktionen können in der Konvertierungsformel verwendet werden, um verschiedene Vorgänge auszuführen.

  • min für die Auswahl eines einzelnen Elements aus einem Array
  • if für die Auswahl zwischen Werten
  • Manipulation von Zeichenfolgen (z. B. uppercase())
  • Explizite Konvertierung (z. B. ISO8601_datetime)
  • Aggregation (z. B. avg())

Verfügbare Vorgänge

Dataflows bieten eine Vielzahl von OOTB-Konvertierungsfunktionen (Out-Of-The-Box), mit denen Benutzer mühelos Einheitenkonvertierungen durchführen können, ohne dass komplexe Berechnungen erforderlich sind. Diese vordefinierten Funktionen decken allgemeine Konvertierungen für Temperatur, Druck, Länge, Gewicht und Volumen ab. Die folgende Liste enthält die verfügbaren Konvertierungsfunktionen sowie deren entsprechende Formeln und Funktionsnamen:

Konvertierung Formel Funktionsname
Celsius in Fahrenheit F = (C × 9⁄5) + 32 cToF
Psi in Bar Bar = psi × 0,0689476 psiToBar
Zoll in cm Cm = Zoll × 2,54 inToCm
Fuß in Meter Meter = Fuß × 0,3048 ftToM
Lbs in kg Kg = lbs × 0,453592 lbToKg
Gallonen in Liter Liter = Gallonen × 3,78541 galToL

Zusätzlich zu diesen unidirektionalen Konvertierungen werde ebenfalls Berechnungen in die umgekehrte Richtung unterstützt:

Konvertierung Formel Funktionsname
Fahrenheit in Celsius C = (F − 32) × 5⁄9 fToC
Bar in psi Psi = Bar ÷ 0,0689476 barToPsi
Cm in Zoll Zoll = cm ÷ 2,54 cmToIn
Meter in Fuß Fuß = Meter ÷ 0,3048 mToFt
Kg in lbs Lbs = kg ÷ 0,453592 kgToLb
Liter in Gallonen Gallonen = Liter ÷ 3,78541 lToGal

Diese Funktionen sind so konzipiert, dass sie den Konvertierungsprozess vereinfachen. Dadurch können Benutzer Werte in einer Einheit eingeben und den entsprechenden Wert mühelos in einer anderen Einheit erhalten.

Zudem wird eine Skalierungsfunktion bereitgestellt, mit der der Wertbereich auf den benutzerdefinierten Bereich skaliert werden kann. Im Beispiel scale($1,0,10,0,100) wird der Eingabewert vom Bereich 0 bis 10 auf den Bereich 0 bis 100 skaliert.

Darüber hinaus können Benutzer ihre eigenen Konvertierungsfunktionen mithilfe einfacher mathematischer Formeln flexibel definieren. Unser System unterstützt grundlegende Operatoren wie Addition (+), Subtraktion (-), Multiplikation (*) und Division (/). Diese Operatoren befolgen die Standardregeln der Rangfolge, wodurch Multiplikation und Division vor Addition und Subtraktion ausgeführt werden. Diese können mithilfe von Klammern angepasst werden, damit die Vorgänge in der richtigen Reihenfolge ausgeführt werden. Mit dieser Funktion können Benutzer ihre Einheitenkonvertierungen an bestimmte Anforderungen oder Präferenzen anpassen, was den Gesamtnutzen und die Vielseitigkeit des Systems verbessert.

Für komplexere Berechnungen sind außerdem Funktionen wie sqrt verfügbar. Diese Funktion ermittelt die Quadratwurzel einer Zahl.

Verfügbare arithmetische Operatoren, Vergleichsoperatoren und boolesche Operatoren nach der Rangfolge gruppiert

Operator Beschreibung
^ Potenzierung: $1³

Da Exponentiation die höchste Priorität hat, wird dieser Vorgang zuerst ausgeführt, sofern diese Reihenfolge nicht durch Klammern überschrieben wird:

  • $1 * 2 ^ 3 wird als $1 * 8 interpretiert, weil der Teil 2 ^ 3 vor der Multiplikation ausgeführt wird.
  • Bei ($1 * 2) ^ 3 wird die Multiplikation vor der Potenzierung verarbeitet.
Operator Beschreibung
- Negation
! Logisches Nicht

Negation und Logical not haben hohe Priorität, wodurch sie außer bei der Potenzierung immer an ihrem unmittelbaren Nachbarn bleiben:

  • Bei -$1 * 2 wird $1 zunächst negiert und anschließend multipliziert.
  • Bei -($1 * 2) wird das Ergebnis multipliziert und anschließend negiert.
Operator Beschreibung
* Multiplikation: $1 × 10
/ Division: $1 ÷ 25 (Ergebnis ist eine ganze Zahl, wenn beide Argumente ganze Zahlen sind, andernfalls eine Gleitkommazahl)
% Modulo: $1 % 25

Multiplication, Division und Modulo werden bei gleicher Rangfolge von links nach rechts ausgeführt, es sei denn, die Reihenfolge wird durch Klammern geändert.

Operator Beschreibung
+ Addition für numerische Werte, Verkettung für Zeichenfolgen
- Subtraktion

Addition und Subtraction werden im Vergleich zu den Operatoren in der vorherigen Gruppe als schwächer eingestuft:

  • Bei $1 + 2 * 3 wird $1 + 6 berechnet, da 2 * 3 aufgrund der höheren Rangfolge von Multiplication zuerst ausgeführt wird.
  • Bei ($1 + 2) * 3 wird addition vor multiplication priorisiert.
Operator Beschreibung
< Kleiner als
> Größer als
<= Kleiner als oder gleich
>= Größer als oder gleich
== Gleich
!= Ungleich

Bei Comparisons werden numerische und boolesche Werte sowie Zeichenfolgenwerten verarbeitet. Da sie eine niedrigere Rangfolge als arithmetische Operatoren aufweisen, sind keine Klammern erforderlich, um Ergebnisse effektiv zu vergleichen:

  • $1 * 2 <= $2 entspricht ($1 * 2) <= $2.
Operator Beschreibung
|| Logisches OR
&& Logisches AND

Logische Operatoren werden zur Verkettung von Bedingungen verwendet:

  • $1 > 100 && $2 > 200