Udostępnij za pośrednictwem


Konwertowanie danych przy użyciu konwersji przepływu danych

Ważne

Ta strona zawiera instrukcje dotyczące zarządzania składnikami operacji usługi Azure IoT przy użyciu manifestów wdrażania platformy Kubernetes, które są w wersji zapoznawczej. Ta funkcja jest udostępniana z kilkoma ograniczeniami i nie powinna być używana w przypadku obciążeń produkcyjnych.

Zobacz Dodatkowe warunki użytkowania wersji zapoznawczych platformy Microsoft Azure, aby zapoznać się z postanowieniami prawnymi dotyczącymi funkcji platformy Azure, które są w wersji beta lub wersji zapoznawczej albo w inny sposób nie zostały jeszcze wydane jako ogólnie dostępne.

Konwersje przepływu danych umożliwiają przekształcanie danych w operacjach usługi Azure IoT. Element konwersji w przepływie danych służy do obliczania wartości dla pól wyjściowych. W konwersjach przepływu danych można używać pól wejściowych, dostępnych operacji, typów danych i konwersji typów.

Element konwersji przepływu danych służy do obliczania wartości pól wyjściowych:

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

Istnieje kilka aspektów, które należy zrozumieć na temat konwersji:

  • Odwołanie do pól wejściowych: Jak odwoływać się do wartości z pól wejściowych w formule konwersji.
  • Dostępne operacje: operacje, które mogą być używane w konwersjach. Na przykład dodawanie, odejmowanie, mnożenie i dzielenie.
  • Typy danych: typy danych, które formuła może przetwarzać i manipulować. Na przykład liczba całkowita, zmiennoprzecinkowa i ciąg.
  • Konwersje typów: sposób konwertowania typów danych między wartościami pól wejściowych, oceną formuły i polami wyjściowymi.

Pola wejściowe

W konwersjach formuły mogą działać na wartościach statycznych, takich jak liczba, taka jak 25 lub parametry pochodzące z pól wejściowych. Mapowanie definiuje te pola wejściowe, do których może uzyskać dostęp formuła. Każde pole jest przywołyne zgodnie z kolejnością na liście danych wejściowych:

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

W tym przykładzie konwersja powoduje utworzenie tablicy zawierającej [Max, Min, Mid.Avg, Mid.Mean]wartości . Komentarze w pliku YAML (# - $1, # - $2) są opcjonalne, ale pomagają wyjaśnić połączenie między każdą właściwością pola a jego rolą w formule konwersji.

Typy danych

Różne formaty serializacji obsługują różne typy danych. Na przykład kod JSON oferuje kilka typów pierwotnych: ciąg, liczba, wartość logiczna i wartość null. Zawiera również tablice tych typów pierwotnych.

Gdy maper odczytuje właściwość wejściową, konwertuje ją na typ wewnętrzny. Ta konwersja jest niezbędna do przechowywania danych w pamięci, dopóki nie zostanie ona zapisana w polu wyjściowym. Konwersja na typ wewnętrzny odbywa się niezależnie od tego, czy formaty serializacji wejściowej i wyjściowej są takie same.

Reprezentacja wewnętrzna wykorzystuje następujące typy danych:

Type Opis
bool Wartość logiczna prawda/fałsz.
integer Przechowywane jako 128-bitowa liczba całkowita ze znakiem.
float Przechowywane jako 64-bitowa liczba zmiennoprzecinkowa.
string Ciąg UTF-8.
bytes Dane binarne, ciąg 8-bitowych wartości niepodpisanych.
datetime czasu UTC lub czasu lokalnego z rozdzielczością nanosekund.
time Pora dnia z rozdzielczością nanosekund.
duration Czas trwania z nanosekundową rozdzielczością.
array Tablica wszystkich typów wymienionych wcześniej.
map Wektor par (klucz, wartość) wszystkich typów wymienionych wcześniej.

Pola rekordów wejściowych

Gdy pole rekordu wejściowego jest odczytywane, jego typ podstawowy jest konwertowany na jeden z tych wariantów typu wewnętrznego. Reprezentacja wewnętrzna jest wystarczająco wszechstronna, aby obsługiwać większość typów danych wejściowych z minimalną lub bez konwersji.

W przypadku niektórych formatów używane są typy zastępcze. Na przykład kod JSON nie ma datetime typu i zamiast tego przechowuje datetime wartości jako ciągi sformatowane zgodnie z ISO8601. Gdy maper odczytuje takie pole, wewnętrzna reprezentacja pozostaje ciągiem.

Pola rekordów wyjściowych

Maper został zaprojektowany tak, aby był elastyczny przez konwertowanie typów wewnętrznych na typy wyjściowe w celu uwzględnienia scenariuszy, w których dane pochodzą z formatu serializacji z ograniczonym systemem typów. W poniższych przykładach pokazano, jak są obsługiwane konwersje:

  • Typy liczbowe: te typy można przekonwertować na inne reprezentacje, nawet jeśli oznacza to utratę dokładności. Na przykład 64-bitowa liczba zmiennoprzecinkowa (f64) można przekonwertować na 32-bitową liczbę całkowitą (i32).
  • Ciągi do liczb: jeśli rekord przychodzący zawiera ciąg, taki jak 123 i pole wyjściowe jest 32-bitową liczbą całkowitą, maper konwertuje i zapisuje wartość jako liczbę.
  • Ciągi do innych typów:
    • Jeśli pole wyjściowe to datetime, maper próbuje przeanalizować ciąg jako ISO8601 sformatowany datetime.
    • Jeśli pole wyjściowe to binary/bytes, maper próbuje wykonać deserializacji ciągu z ciągu zakodowanego w formacie base64.
  • Wartości logiczne:
    • Przekonwertowany na 0/1 , jeśli pole wyjściowe jest numeryczne.
    • Przekonwertowane na true/false wartość , jeśli pole wyjściowe jest ciągiem.

Używanie formuły konwersji z typami

W mapowaniach opcjonalna formuła może określić sposób przetwarzania danych z danych wejściowych przed zapisaniem w polu wyjściowym. Jeśli żadna formuła nie zostanie określona, maper kopiuje pole wejściowe do danych wyjściowych przy użyciu wewnętrznych reguł typów i konwersji.

Jeśli zostanie określona formuła, typy danych dostępne do użycia w formułach są ograniczone do:

  • Liczby całkowite
  • Liczby zmiennoprzecinkowe
  • Ciągi
  • Wartości logiczne
  • Tablice poprzednich typów
  • Brak wartości

Map i byte nie może uczestniczyć w formułach.

Typy związane z czasem (datetime, time, i duration) są konwertowane na wartości całkowite reprezentujące czas w sekundach. Po ocenie formuły wyniki są przechowywane w wewnętrznej reprezentacji i nie są konwertowane z powrotem. Na przykład datetime przekonwertowana na sekundy pozostaje liczbą całkowitą. Jeśli wartość będzie używana w datetime polach, należy zastosować jawną metodę konwersji. Przykładem jest przekonwertowanie wartości na ciąg ISO8601, który jest automatycznie konwertowany na datetime typ formatu serializacji wyjściowej.

Używanie typów nieregularnych

Specjalne zagadnienia dotyczą typów, takich jak tablice i brakująca wartość.

Tablice

Tablice mogą być przetwarzane przy użyciu funkcji agregacji w celu obliczenia pojedynczej wartości z wielu elementów. Na przykład przy użyciu rekordu wejściowego:

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

Za pomocą mapowania:

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

Ta konfiguracja wybiera najmniejszą wartość z Measurements tablicy dla pola wyjściowego.

Tablice można również tworzyć na podstawie wielu pojedynczych wartości:

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

To mapowanie tworzy tablicę zawierającą minimalną, maksymalną, średnią i średnią.

Brak wartości

Brak wartości to specjalny typ używany w scenariuszach, takich jak:

  • Obsługa brakujących pól w danych wejściowych przez podanie wartości alternatywnej.
  • Warunkowe usunięcie pola na podstawie jego obecności.

Przykładowe mapowanie używające brakującej wartości:

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

Rekord wejściowy zawiera BaseSalary pole, ale prawdopodobnie jest to opcjonalne. Załóżmy, że jeśli brakuje pola, należy dodać wartość z zestawu danych kontekstowego:

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

Mapowanie może sprawdzić, czy pole znajduje się w rekordzie wejściowym. Jeśli to pole zostanie znalezione, dane wyjściowe odbierają istniejącą wartość. W przeciwnym razie dane wyjściowe odbierają wartość z zestawu danych kontekstu. Na przykład:

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

Używa conversion if funkcji, która ma trzy parametry:

  • Pierwszy parametr jest warunkiem. W tym przykładzie sprawdza, czy BaseSalary brakuje pola wejściowego (aliasu jako $1) .
  • Drugi parametr jest wynikiem funkcji, jeśli warunek w pierwszym parametrze ma wartość true. W tym przykładzie jest BaseSalary to pole zestawu danych kontekstualizacji (alias o nazwie $2).
  • Trzeci parametr to wartość warunku, jeśli pierwszy parametr ma wartość false.

Dostępne funkcje

Przepływy danych udostępniają zestaw wbudowanych funkcji, które mogą być używane w formułach konwersji. Te funkcje mogą służyć do wykonywania typowych operacji, takich jak operacje arytmetyczne, porównywanie i manipulowanie ciągami. Dostępne funkcje to:

Function opis Przykłady
min Zwraca wartość minimalną z tablicy. min(2, 3, 1)min($1) funkcja zwraca 1wartość minimalną z tablicy$1
max Zwraca wartość maksymalną z tablicy. max(2, 3, 1)max($1) funkcja zwraca 3wartość maksymalną z tablicy$1
if Zwracanie między wartościami na podstawie warunku. if($1 > 10, 'High', 'Low') zwraca 'High' wartość , jeśli $1 wartość jest większa niż 10, w przeciwnym razie 'Low'
len Zwraca długość znaku ciągu lub liczbę elementów w krople. len("Azure")zwraca 5wartość , len(1, 2, 3) zwraca len($1) 3liczbę elementów w tablicy$1
floor Zwraca największą liczbę całkowitą mniejszą lub równą liczbie. floor(2.9) Zwraca 2
round Zwróć najbliższą liczbę całkowitą do liczby, zaokrąglając przypadki w połowie drogi z dala od 0,0. round(2.5) Zwraca 3
ceil Zwraca najmniejszą liczbę całkowitą większą lub równą liczbie. ceil(2.1) Zwraca 3
scale Skaluj wartość z jednego zakresu do innego. scale($1, 0, 10, 0, 100) skaluje wartość wejściową z zakresu od 0 do 10 do zakresu od 0 do 100

Funkcje konwersji

Przepływy danych udostępniają kilka wbudowanych funkcji konwersji dla typowych konwersji jednostek, takich jak temperatura, ciśnienie, długość, waga i objętość. Oto kilka przykładów:

Konwersja Formuła Nazwa funkcji
Stopnie Celsjusza do Fahrenheita F = (C * 9/5) + 32 cToF
Interfejs PSI do paska Słupek = PSI * 0,0689476 psiToBar
Cal do cm Cm = cal * 2,54 inToCm
Stopa do miernika Miernik = stopa * 0,3048 ftToM
Lbs do kg Kg = lbs * 0,453592 lbToKg
Galony do litrów Litry = galony * 3,78541 galToL

Obsługiwane są również konwersje odwrotne:

Konwersja Formuła Nazwa funkcji
Fahrenheit do Stopni Celsjusza C = (F - 32) * 5/9 fToC
Pasek do interfejsu PSI PSI = bar / 0,0689476 barToPsi
Cm do cala Cal = cm / 2,54 cmToIn
Miernik na stopę Stopa = miernik / 0,3048 mToFt
Kg do lbs Lbs = kg / 0,453592 kgToLb
Litry do galonów Galony = litry / 3,78541 lToGal

Ponadto można zdefiniować własne funkcje konwersji przy użyciu podstawowych formuł matematycznych. System obsługuje operatory, takie jak dodawanie (+), odejmowanie (-), mnożenie (*) i dzielenie (/). Te operatory są zgodne ze standardowymi regułami pierwszeństwa, które można dostosować przy użyciu nawiasów w celu zapewnienia prawidłowej kolejności operacji. Dzięki temu można dostosować konwersje jednostek w celu spełnienia określonych potrzeb.

Dostępne operatory według pierwszeństwa

Operator opis
^ Wykładnik: $1 ^ 3

Ponieważ Exponentiation ma najwyższy priorytet, jest wykonywany jako pierwszy, chyba że nawiasy zastępują następującą kolejność:

  • $1 * 2 ^ 3 jest interpretowany jako $1 * 8 ponieważ 2 ^ 3 część jest wykonywana jako pierwsza, przed mnożeniem.
  • ($1 * 2) ^ 3 przetwarza mnożenie przed wykładnikiem.
Operator opis
- Negacja
! Logiczne NOT

Negation i Logical not mają wysoki priorytet, więc zawsze trzymają się swojego najbliższego sąsiada, z wyjątkiem sytuacji, gdy jest zaangażowany wykładnik:

  • -$1 * 2 najpierw neguje $1 , a następnie mnoży.
  • -($1 * 2) mnoży, a następnie neguje wynik.
Operator opis
* Mnożenie: $1 * 10
/ Dzielenie: $1 / 25 (Wynik jest liczbą całkowitą, jeśli oba argumenty są liczbami całkowitymi, w przeciwnym razie zmiennoprzecinkowe)
% Modulo: $1 % 25

Multiplication, Divisioni Modulo, o tym samym pierwszeństwie, są wykonywane od lewej do prawej, chyba że kolejność jest zmieniana przez nawiasy.

Operator opis
+ Dodawanie wartości liczbowych, łączenie ciągów
- Odejmowanie

Addition i Subtraction są uznawane za słabsze operacje w porównaniu z operacjami w poprzedniej grupie:

  • $1 + 2 * 3$1 + 6 powoduje wykonanie elementu , ponieważ 2 * 3 jest wykonywane najpierw z powodu wyższego pierwszeństwa elementu multiplication.
  • ($1 + 2) * 3 Określa Addition priorytety przed Multiplication.
Operator opis
< Mniejsze niż
> Większe niż
<= Mniejsze niż lub równe
>= Większe niż lub równe
== Równa się
!= Nierówne

Comparisons działają na wartościach liczbowych, logicznych i ciągowych. Ponieważ mają one niższy priorytet niż operatory arytmetyczne, żadne nawiasy nie są potrzebne do efektywnego porównywania wyników:

  • $1 * 2 <= $2 jest równoważne z ($1 * 2) <= $2.
Operator opis
|| OR logiczne
&& AND logiczne

Operatory logiczne są używane do tworzenia łańcuchów warunków:

  • $1 > 100 && $2 > 200