Delen via


Gegevens converteren met behulp van gegevensstroomconversies

Belangrijk

Deze pagina bevat instructies voor het beheren van Azure IoT Operations-onderdelen met behulp van Kubernetes-implementatiemanifesten, die in preview zijn. Deze functie is voorzien van verschillende beperkingen en mag niet worden gebruikt voor productieworkloads.

Raadpleeg de Aanvullende voorwaarden voor Microsoft Azure-previews voor juridische voorwaarden die van toepassing zijn op Azure-functies die in bèta of preview zijn of die anders nog niet algemeen beschikbaar zijn.

U kunt gegevensstroomconversies gebruiken om gegevens te transformeren in Azure IoT Operations. Het conversieelement in een gegevensstroom wordt gebruikt om waarden voor uitvoervelden te berekenen. U kunt invoervelden, beschikbare bewerkingen, gegevenstypen en typeconversies gebruiken in gegevensstroomconversies.

Het conversieelement voor gegevensstromen wordt gebruikt voor het berekenen van waarden voor uitvoervelden:

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

Er zijn verschillende aspecten die u moet begrijpen over conversies:

  • Verwijzing naar invoervelden: verwijzing naar waarden uit invoervelden in de conversieformule.
  • Beschikbare bewerkingen: bewerkingen die kunnen worden gebruikt in conversies. Bijvoorbeeld optellen, aftrekken, vermenigvuldigen en delen.
  • Gegevenstypen: typen gegevens die een formule kan verwerken en bewerken. Bijvoorbeeld gehele getallen, drijvende komma en tekenreeks.
  • Typeconversies: hoe gegevenstypen worden geconverteerd tussen de waarden van het invoerveld, de formule-evaluatie en de uitvoervelden.

Invoervelden

In conversies kunnen formules worden uitgevoerd op statische waarden, zoals een getal zoals 25 of parameters die zijn afgeleid van invoervelden. Een toewijzing definieert deze invoervelden waartoe de formule toegang heeft. Naar elk veld wordt verwezen volgens de volgorde in de invoerlijst:

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

In dit voorbeeld resulteert de conversie in een matrix met de waarden van [Max, Min, Mid.Avg, Mid.Mean]. De opmerkingen in het YAML-bestand (# - $1, # - $2) zijn optioneel, maar ze helpen bij het verduidelijken van de verbinding tussen elke veldeigenschap en de bijbehorende rol in de conversieformule.

Data types

Verschillende serialisatie-indelingen ondersteunen verschillende gegevenstypen. JSON biedt bijvoorbeeld een aantal primitieve typen: tekenreeks, getal, Booleaanse waarde en null. Het bevat ook matrices van deze primitieve typen.

Wanneer de mapper een invoereigenschap leest, wordt deze geconverteerd naar een intern type. Deze conversie is nodig voor het opslaan van de gegevens in het geheugen totdat deze zijn weggeschreven naar een uitvoerveld. De conversie naar een intern type gebeurt ongeacht of de indelingen voor invoer- en uitvoerserialisatie hetzelfde zijn.

De interne weergave maakt gebruik van de volgende gegevenstypen:

Type Description
bool Logische waar/onwaar.
integer Opgeslagen als een geheel getal van 128-bits teken.
float Opgeslagen als 64-bits drijvendekommanummer.
string Een UTF-8-tekenreeks.
bytes Binaire gegevens, een tekenreeks met niet-ondertekende waarden van 8 bits.
datetime UTC of lokale tijd met nanoseconde resolutie.
time Tijdstip van de dag met nanoseconde resolutie.
duration Een duur met nanoseconde resolutie.
array Een matrix van alle typen die eerder worden vermeld.
map Een vector van (sleutel-, waardeparen) van alle eerder vermelde typen.

Invoerrecordvelden

Wanneer een invoerrecordveld wordt gelezen, wordt het onderliggende type geconverteerd naar een van deze interne typevarianten. De interne weergave is veelzijdig genoeg om de meeste invoertypen met minimale of geen conversie te verwerken.

Voor sommige indelingen worden surrogaattypen gebruikt. JSON heeft datetime bijvoorbeeld geen type en slaat datetime in plaats daarvan waarden op als tekenreeksen die zijn opgemaakt volgens ISO8601. Wanneer de mapper een dergelijk veld leest, blijft de interne weergave een tekenreeks.

Uitvoerrecordvelden

De mapper is ontworpen om flexibel te zijn door interne typen te converteren naar uitvoertypen voor scenario's waarin gegevens afkomstig zijn van een serialisatie-indeling met een beperkt typesysteem. In de volgende voorbeelden ziet u hoe conversies worden verwerkt:

  • Numerieke typen: deze typen kunnen worden geconverteerd naar andere weergaven, zelfs als dit betekent dat precisie verloren gaat. Een 64-bits drijvendekommagetal (f64) kan bijvoorbeeld worden geconverteerd naar een 32-bits geheel getal (i32).
  • Tekenreeksen naar getallen: Als de binnenkomende record een tekenreeks bevat zoals 123 en het uitvoerveld een 32-bits geheel getal is, converteert en schrijft de mapper de waarde als een getal.
  • Tekenreeksen naar andere typen:
    • Als het uitvoerveld is datetime, probeert de mapper de tekenreeks te parseren als een ISO8601 opgemaakt datetime.
    • Als het uitvoerveld is binary/bytes, probeert de mapper deserialiseren van de tekenreeks van een met base64 gecodeerde tekenreeks.
  • Booleaanse waarden:
    • Wordt geconverteerd naar 0/1 of het uitvoerveld numeriek is.
    • Wordt geconverteerd naar true/false of het uitvoerveld een tekenreeks is.

Een conversieformule gebruiken met typen

In toewijzingen kan een optionele formule opgeven hoe gegevens uit de invoer worden verwerkt voordat ze naar het uitvoerveld worden geschreven. Als er geen formule is opgegeven, kopieert de mapper het invoerveld naar de uitvoer met behulp van het interne type en de conversieregels.

Als er een formule is opgegeven, zijn de gegevenstypen die beschikbaar zijn voor gebruik in formules beperkt tot:

  • Gehele getallen
  • Getallen met drijvende komma
  • Tekenreeksen
  • Booleaans
  • Matrices van de voorgaande typen
  • Ontbrekende waarde

Map en byte kan niet deelnemen aan formules.

Typen die betrekking hebben op tijd (datetimetime, en duration) worden geconverteerd naar gehele getallen die de tijd in seconden vertegenwoordigen. Na de evaluatie van formules worden de resultaten opgeslagen in de interne weergave en niet terug geconverteerd. Geconverteerd naar seconden blijft bijvoorbeeld datetime een geheel getal. Als de waarde wordt gebruikt in datetime velden, moet er een expliciete conversiemethode worden toegepast. Een voorbeeld is het converteren van de waarde naar een ISO8601 tekenreeks die automatisch wordt geconverteerd naar het datetime type uitvoerserialisatieindeling.

Onregelmatige typen gebruiken

Speciale overwegingen zijn van toepassing op typen, zoals matrices en ontbrekende waarde.

Matrices

Matrices kunnen worden verwerkt met behulp van aggregatiefuncties om één waarde van meerdere elementen te berekenen. Bijvoorbeeld met behulp van de invoerrecord:

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

Met de toewijzing:

inputs: [
  'Measurements' // - $1
]
output: 'Measurement'
expression: 'min($1)'

Deze configuratie selecteert de kleinste waarde in de Measurements matrix voor het uitvoerveld.

Matrices kunnen ook worden gemaakt op basis van meerdere waarden:

inputs: [
  'minimum' // - - $1
  'maximum' // - - $2
  'average' // - - $3
  'mean'    // - - $4
]
output: 'stats'
expression: '($1, $2, $3, $4)'

Met deze toewijzing maakt u een matrix die het minimum, maximum, gemiddelde en gemiddelde bevat.

Ontbrekende waarde

Ontbrekende waarde is een speciaal type dat wordt gebruikt in scenario's, zoals:

  • Ontbrekende velden in de invoer verwerken door een alternatieve waarde op te geven.
  • Een veld voorwaardelijk verwijderen op basis van de aanwezigheid ervan.

Voorbeeldtoewijzing die gebruikmaakt van een ontbrekende waarde:

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

De invoerrecord bevat het BaseSalary veld, maar mogelijk is dat optioneel. Stel dat als het veld ontbreekt, een waarde moet worden toegevoegd vanuit een contextuele gegevensset:

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

Een toewijzing kan controleren of het veld aanwezig is in de invoerrecord. Als het veld wordt gevonden, ontvangt de uitvoer die bestaande waarde. Anders ontvangt de uitvoer de waarde van de contextgegevensset. Voorbeeld:

inputs: [
  'BaseSalary' // - - - - - - - - - - - $1
  '$context(position).BaseSalary' //  - $2
]
output: 'BaseSalary'
expression: 'if($1 == (), $2, $1)'

De conversion functie gebruikt de if functie met drie parameters:

  • De eerste parameter is een voorwaarde. In het voorbeeld wordt gecontroleerd of het BaseSalary veld van het invoerveld (aliased as $1) de ontbrekende waarde is.
  • De tweede parameter is het resultaat van de functie als de voorwaarde in de eerste parameter waar is. In dit voorbeeld is dit het BaseSalary veld van de contextgegevensset (alias genoemd als $2).
  • De derde parameter is de waarde voor de voorwaarde als de eerste parameter onwaar is.

Beschikbare functies

Gegevensstromen bieden een set ingebouwde functies die kunnen worden gebruikt in conversieformules. Deze functies kunnen worden gebruikt om algemene bewerkingen uit te voeren, zoals rekenkundige bewerkingen, vergelijkingen en tekenreeksbewerkingen. De beschikbare functies zijn:

Functie Beschrijving Voorbeelden
min Retourneert de minimumwaarde van een matrix. min(2, 3, 1) retourneert 1, min($1) retourneert de minimumwaarde van de matrix $1
max Retourneert de maximumwaarde van een matrix. max(2, 3, 1) retourneert 3, max($1) retourneert de maximumwaarde van de matrix $1
if Retourneren tussen waarden op basis van een voorwaarde. if($1 > 10, 'High', 'Low') retourneert 'High' als $1 deze groter is dan 10, anders 'Low'
len Retourneert de tekenlengte van een tekenreeks of het aantal elementen in een tuple. len("Azure")retourneert, len(1, 2, 3) retourneert53, len($1) retourneert het aantal elementen in de matrix$1
floor Hiermee wordt het grootste gehele getal geretourneerd dat kleiner is dan of gelijk is aan een getal. floor(2.9) Retourneert 2
round Retourneer het dichtstbijzijnde gehele getal naar een getal, waarbij halve richtingen worden afgerond van 0,0. round(2.5) Retourneert 3
ceil Retourneert het kleinste gehele getal dat groter is dan of gelijk is aan een getal. ceil(2.1) Retourneert 3
scale Schaal een waarde van het ene bereik naar het andere. scale($1, 0, 10, 0, 100) schaalt de invoerwaarde van het bereik 0 tot 10 naar het bereik 0 tot 100

Conversiefuncties

Gegevensstromen bieden verschillende ingebouwde conversiefuncties voor algemene eenheidsconversies, zoals temperatuur, druk, lengte, gewicht en volume. Hieronder volgen een aantal voorbeelden:

Conversie Formule Functienaam
Celsius tot Fahrenheit F = (C * 9/5) + 32 cToF
PSI naar staaf Staaf = PSI * 0,0689476 psiToBar
Inch tot cm Cm = inch * 2,54 inToCm
Voet naar meter Meter = voet * 0,3048 ftToM
Lbs tot kg Kg = lbs * 0,453592 lbToKg
Gallon naar liter Liter = gallons * 3,78541 galToL

Omgekeerde conversies worden ook ondersteund:

Conversie Formule Functienaam
Fahrenheit naar Celsius C = (F - 32) * 5/9 fToC
Staaf naar PSI PSI = staaf / 0,0689476 barToPsi
Cm tot inch Inch = cm / 2,54 cmToIn
Meter tot voet Voet = meter / 0,3048 mToFt
Kg tot lbs Lbs = kg / 0,453592 kgToLb
Liter naar gallons Gallons = liter / 3,78541 lToGal

Daarnaast kunt u uw eigen conversiefuncties definiëren met behulp van eenvoudige wiskundige formules. Het systeem ondersteunt operators zoals optellen (+), aftrekken (-), vermenigvuldigen (*) en delen (/). Deze operators volgen de standaardregels van prioriteit, die kunnen worden aangepast met haakjes om de juiste volgorde van bewerkingen te garanderen. Hiermee kunt u eenheidsconversies aanpassen aan specifieke behoeften.

Beschikbare operators op prioriteit

Operator Beschrijving
^ Exponentiatie: $ 1 ^ 3

Omdat Exponentiation de hoogste prioriteit heeft, wordt deze eerst uitgevoerd, tenzij haakjes deze volgorde overschrijven:

  • $1 * 2 ^ 3 wordt geïnterpreteerd als $1 * 8 omdat het 2 ^ 3 onderdeel eerst wordt uitgevoerd, vóór vermenigvuldigen.
  • ($1 * 2) ^ 3 verwerkt de vermenigvuldiging vóór exponentiatie.
Operator Beschrijving
- Negatie
! Logisch niet

Negation en Logical not hebben hoge prioriteit, zodat ze altijd bij hun directe buur blijven, behalve wanneer exponentiatie betrokken is:

  • -$1 * 2 negeert $1 eerst en vermenigvuldigt vervolgens.
  • -($1 * 2) vermenigvuldigt het en negeert het resultaat.
Operator Beschrijving
* Vermenigvuldiging: $ 1 * 10
/ Deling: $ 1 / 25 (resultaat is een geheel getal als beide argumenten gehele getallen zijn, anders zwevend)
% Modulo: $ 1 % 25

Multiplication, Divisionen Modulo, met dezelfde prioriteit, worden van links naar rechts uitgevoerd, tenzij de volgorde wordt gewijzigd door haakjes.

Operator Beschrijving
+ Optellen voor numerieke waarden, samenvoeging voor tekenreeksen
- Aftrekken

Addition en Subtraction worden beschouwd als zwakkere bewerkingen vergeleken met de bewerkingen in de vorige groep:

  • $1 + 2 * 3 resulteert in $1 + 6 omdat 2 * 3 het eerst wordt uitgevoerd vanwege de hogere prioriteit van multiplication.
  • ($1 + 2) * 3 prioriteert Addition vóór Multiplication.
Operator Beschrijving
< Kleiner dan
> Groter dan
<= Kleiner dan of gelijk aan
>= Groter dan of gelijk aan
== Gelijk aan
!= Niet gelijk aan

Comparisons werken op numerieke, Booleaanse en tekenreekswaarden. Omdat ze een lagere prioriteit hebben dan rekenkundige operatoren, zijn er geen haakjes nodig om de resultaten effectief te vergelijken:

  • $1 * 2 <= $2 is equivalent aan ($1 * 2) <= $2.
Operator Beschrijving
|| Logische OR
&& Logische EN

Logische operators worden gebruikt om voorwaarden te koppelen:

  • $1 > 100 && $2 > 200