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 sformatowanydatetime
. - Jeśli pole wyjściowe to
binary/bytes
, maper próbuje wykonać deserializacji ciągu z ciągu zakodowanego w formacie base64.
- Jeśli pole wyjściowe to
- 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.
- Przekonwertowany na
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 1 wartość minimalną z tablicy$1 |
max |
Zwraca wartość maksymalną z tablicy. | max(2, 3, 1) max($1) funkcja zwraca 3 wartość 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 5 wartość , len(1, 2, 3) zwraca len($1) 3 liczbę 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
, Division
i 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 elementumultiplication
.($1 + 2) * 3
OkreślaAddition
priorytety przedMultiplication
.
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