Gegevens transformeren met een map-functie in gegevensstromen

In Azure IoT-bewerkingen neemt een maptransformatie elk binnenkomend bericht in een dataflowgrafiek en produceert een outputbericht op basis van jouw regels. U kunt velden een andere naam geven, ze opnieuw orden in nieuwe structuren, afgeleide waarden berekenen of ongewenste velden verwijderen. Door wildcardregels te gebruiken, kun je alle velden tegelijk kopiëren.

Zie Het overzicht van gegevensstroomgrafieken voor een overzicht van gegevensstroomgrafieken en hoe transformaties in een pijplijn worden samengesteld.

Transformaties gebruiken een expressietaal om waarden, testvoorwaarden en referentievelden te berekenen. Expressies verwijzen naar invoer op positie, niet op naam: de eerste invoer in de inputs lijst is $1, de tweede is $2, enzovoort. Ingebouwde functies zoals cToF converteren en manipuleren deze waarden.

Voor de volledige lijst van operatoren, functies, datatypes en metadatavelden, zie de referentie Expressions.

Vereiste voorwaarden

  • Een exemplaar van Azure IoT-bewerkingen geïmplementeerd in een Kubernetes-cluster. Zie Deploy Azure IoT-bewerkingen voor meer informatie.
  • Een standaardregistereindpunt dat naar defaultmcr.microsoft.com verwijst wordt automatisch gemaakt tijdens de implementatie. De ingebouwde transformaties gebruiken dit eindpunt.

De Azure CLI voorbeelden in dit artikel gebruiken omgevingsvariabelen zodat je elke waarde één keer kunt instellen en vervolgens de commando's kunt kopiëren en plakken as-is. Als je de Azure IoT-bewerkingen Codespaces-omgeving vanuit de quickstart gebruikt, zijn deze variabelen al voor je ingesteld en kun je deze stap overslaan. Anders stel je de volgende omgevingsvariabelen in je shell voordat je de commando's uitvoert.

De volgende scripts stellen de meest gebruikte omgevingsvariabelen in:

Omgevingsvariabele Beschrijving
SUBSCRIPTION_ID De ID van het abonnement dat je Azure IoT-bewerkingen-instantie bevat.
RESOURCE_GROUP De naam van de resourcegroep die je Azure IoT-bewerkingen-instantie bevat.
AIO_INSTANCE_NAME De naam van je Azure IoT-bewerkingen instance. Om je instanties op te sommen, voer az iot ops list -o tableje .
CLUSTER_NAME De naam van de Azure Arc-enabled Kubernetes-cluster die jouw instantie host.
LOCATION De Azure-regio om te gebruiken voor nieuwe bronnen, bijvoorbeeld eastus.
SUBSCRIPTION_ID=<subscription-id>
RESOURCE_GROUP=<resource-group-name>
AIO_INSTANCE_NAME=<instance-name>
CLUSTER_NAME=<cluster-name>
LOCATION=<region>

Je hoeft alleen de variabelen in te stellen die dit artikel gebruikt. Dit artikel kan extra omgevingsvariabelen gebruiken voor de bronnamen die je kiest. Het artikel legt uit hoe je ze op de plek kunt plaatsen waar ze worden geïntroduceerd.

Hoe kaartregels werken

Elke kaartregel heeft vier delen:

Vastgoed Verplicht Beschrijving
inputs Ja Lijst met veldpaden die moeten worden gelezen vanuit het binnenkomende bericht.
output Ja Veldpad waar het resultaat in het uitvoerbericht verschijnt.
expression No Formule toegepast op de invoerwaarden. Als je het weglaat, kopieert de eerste invoerwaarde direct.
description No Leesbaar label voor de regel, opgenomen in foutberichten.

De maptransformatie wijst positievariabelen toe aan invoer in volgorde. Bijvoorbeeld, als inputs is , dan ['Position', 'Office'] is de waarde van $1 en Position is de waarde van $2Office.

De naam van een veld wijzigen

Als u de naam wilt wijzigen BirthDateDateOfBirth, wijst u één invoer toe aan een ander uitvoerpad. Je hebt geen uitdrukking nodig. De waarde wordt gekopieerd zoals het is.

In de mappingconfiguratie, voeg een regel toe:

Configuratie Waarde
Invoer BirthDate
Uitvoer DateOfBirth

Velden opnieuw structureren

Gebruik punt notatie in het uitvoerpad om velden naar een geneste structuur te verplaatsen.

Voeg twee regels toe:

Invoer Uitvoer
Name Employee.Name
BirthDate Employee.DateOfBirth

Op basis van deze invoer:

{
  "Name": "Grace Owens",
  "BirthDate": "19840202",
  "Position": "Analyst"
}

Deze twee regels produceren:

{
  "Employee": {
    "Name": "Grace Owens",
    "DateOfBirth": "19840202"
  }
}

Alleen velden die in de uitvoer van een regel worden vermeld, worden weergegeven in het resultaat. Het resultaat bevat het Position veld niet omdat er geen regel het toewijst.

Meerdere invoer combineren

Wanneer je meerdere invoer vermeldt, gebruik dan hun positionele variabelen om ze samen te voegen tot een expressie.

Een regel toevoegen:

Configuratie Waarde
Ingangen Position, Office
Uitvoer Employment.Position
Uitdrukking $1 + ", " + $2

Gegeven Position: "Analyst" en Office: "Kent, WA", de uitvoer is "Analyst, Kent, WA".

Waarden transformeren met expressies

Gebruik het expression veld om ingebouwde functies of rekenkundige functies toe te passen. Het volgende voorbeeld gebruikt cToF, een ingebouwde eenheidsconversiefunctie die een Celsiuswaarde omzet naar Fahrenheit. Onthoud dat dit $1 verwijst naar de eerste invoer, niet naar een veldnaam.

Voor de volledige lijst van operatoren, functies en geavanceerde functies, zie de referentie Expressions. De referentiegroepen groeperen functies per categorie, zoals eenheidsconversie, schalen en afronden, wiskunde en stringfuncties .

Voeg een rekenregel toe. Als u bijvoorbeeld Celsius wilt converteren naar Fahrenheit:

Configuratie Waarde
Invoer temperature
Uitvoer temperature_f
Uitdrukking cToF($1)

Als u een sensor wilt schalen naar een bereik van 0-100, gebruikt u de expressie scale($1, 0, 4095, 0, 100).

Alle velden met jokertekens kopiëren

Wanneer de uitvoer nauw moet overeenkomen met de invoer met slechts enkele wijzigingen, gebruikt u een jokertekenregel om elk veld tegelijk te kopiëren. Voeg vervolgens regels toe om specifieke velden te overschrijven, toe te voegen of te verwijderen.

Voeg een passthrough-regel toe waarmee alle velden worden gekopieerd. Stel de invoer in op * en de uitvoer op *.

Vereisten voor jokertekenregels

  • Een jokertekenregel moet de eerste regel in de kaartconfiguratie zijn.
  • Een maptransformatie ondersteunt slechts één wildcard-regel.
  • Het sterretje komt overeen met een of meer padsegmenten en moet een volledig segment vertegenwoordigen. De maptransformatie ondersteunt geen gedeeltelijke patronen zoals partial*.

Prefix-jokertekens

Beperk de joker tot een specifiek voorvoegsel. Om alle velden van ColorProperties naar het rootniveau te flattenen:

Voeg een regel toe met invoer ColorProperties.* en uitvoer *.

Gegeven:

{
  "ColorProperties": {
    "Hue": "blue",
    "Saturation": "90%",
    "Brightness": "50%"
  }
}

De uitvoer is:

{
  "Hue": "blue",
  "Saturation": "90%",
  "Brightness": "50%"
}

Velden uit de uitvoer verwijderen

Stel de output in op een lege tekenreeks om specifieke velden uit te sluiten. Meestal gebruik je deze aanpak na een jokerregel: kopieer alles, en verwijder dan wat je niet nodig hebt.

  1. Voeg een passthrough-regel toe om alle velden te kopiëren.
  2. Voeg een verwijderregel toe en selecteer de velden die u wilt uitsluiten (bijvoorbeeld password en internal_id).

Een verwijderingsregel mag geen uitdrukking bevatten.

Jokertekens voor specifieke velden overschrijven

Wanneer een jokertekenregel en een specifieke regel beide overeenkomen met hetzelfde veld, heeft de meer specifieke regel voorrang.

  1. Voeg een passthrough-regel toe om alle velden te kopiëren.
  2. Voeg een rekenregel toe voor temperature met de expressie cToF($1).

De kaarttransformatie past de specifieke regel toe op temperature en kopieert alle andere velden zoals ze zijn.

Metagegevensvelden gebruiken

Lees uit en schrijf naar berichten metadata zoals MQTT-onderwerpen en gebruikerseigenschappen. Zie metagegevensvelden in de verwijzing naar expressies.

Voeg een regel met invoer region en uitvoer $metadata.user_property.region toe om een veldwaarde naar een MQTT-gebruikerseigenschap te schrijven.

Zie Berichten doorsturen naar verschillende onderwerpen voor een volledig voorbeeld van dynamische onderwerproutering.

Laatst bekende waarde en standaardwaarden gebruiken

Wanneer sensorgegevens af en toe binnenkomen, kunt u ontbrekende velden invullen met de laatst bekende waarde of een statische standaardwaarde. Zie Laatst bekende waarde en Standaardwaarden in de verwijzing naar expressies.

Voeg een regel toe voor het temperature veld en schakel laatst bekende waarde in. Stel een standaardwaarde van 0 in als een terugvaloptie.

Deze regel gebruikt de huidige waarde wanneer deze aanwezig is, valt terug op de laatst bekende waarde en gebruikt 0 als er geen van beide beschikbaar is.

Verrijken met externe gegevens

Verrijking is optioneel. Je hebt het alleen nodig als je binnenkomende berichten wilt combineren met referentiegegevens die in de state store zijn opgeslagen, zoals een opzoektabel van apparaatmetadata. Als je berichten al alles bevatten wat je nodig hebt, sla dan deze sectie over.

Wanneer je verrijking nodig hebt, configureer dan een contextualisatiedataset die de runtime tijdens de verwerking opzoekt. Zoek bijvoorbeeld de metagegevens van een apparaat op op basis van de id en neem deze op in de uitvoer. Zie Verrijken met externe gegevens voor meer informatie.

Exclusieve functies voor gegevensstroomgrafiek

Gegevensstroomgrafieken ondersteunen verschillende functies die niet beschikbaar zijn in gegevensstroom-mapping builtInTransformation.

Standaardwaarden voor ontbrekende velden

Gebruik de ?? <default> syntaxis voor een invoer om een statische terugval te bieden wanneer een veld ontbreekt. Dit is eenvoudiger dan het schrijven van een if expressie om te controleren op lege waarden.

Stel in de transformatie van de kaartconfiguratie de invoer in om de ?? syntaxis op te nemen, gevolgd door de standaardwaarde. Voer bijvoorbeeld temperature ?? 0 in als het invoerveld dat moet worden gebruikt wanneer het temperatuurveld ontbreekt, 0.

Zie Standaardwaarden in de verwijzing naar expressies voor meer informatie over ondersteunde standaardtypen en het combineren van standaardwaarden met laatst bekende waarden.

Regex-functies

Gegevensstroomgrafieken ondersteunen reguliere expressiekoppeling en vervanging:

  • str::regex_matches(string, pattern): retourneert waar als de tekenreeks overeenkomt met het regex-patroon.
  • str::regex_replace(string, pattern, replacement): vervangt alle regex-overeenkomsten door de vervangende tekenreeks.

Deze functies zijn handig in filterexpressies of voor het opschonen en transformeren van tekenreeksgegevens. Zie Tekenreeksfuncties in de verwijzing naar expressies voor de volledige lijst met tekenreeksfuncties.

Voorbeeld van volledige configuratie

Hier is een complete kaartconfiguratie waarmee alle velden worden gekopieerd, gevoelige gegevens worden verwijderd, een veld opnieuw wordt gestructureerd en een afgeleide waarde wordt berekend.

Schermopname van het transformatieconfiguratievenster van de operatie-ervaringskaart met meerdere regels voor wildcards, verwijderen, herstructureren, berekenen, en samenvoegen.

Maak in de bewerkingservaring een gegevensstroomgrafiek en voeg een kaarttransformatie toe. Voeg in het deelvenster voor kaartconfiguratie regels toe:

  1. Kopieer alle velden met een jokerteken-passthrough.
  2. Verwijder gevoelige velden door de uitvoer in te stellen op leeg voor password en secret_key.
  3. Herstructureer het BirthDate veld in Employee.DateOfBirth.
  4. Bereken een Fahrenheit-omrekening met behulp van de formule cToF($1) op het temperature veld.
  5. Voeg de Position en Office velden samen met de formule $1 + ", " + $2.