重要事項
本頁包含使用 Kubernetes 部署清單管理 Azure IoT Operations 元件的說明,該清單已在預覽中。 此功能的提供具有數項限制,因此不應用於生產工作負載。
請參閱 Microsoft Azure 預覽版增補使用規定,以了解適用於 Azure 功能 (搶鮮版 (Beta)、預覽版,或尚未正式發行的版本) 的法律條款。
您可以使用資料流程轉換,在 Azure IoT 操作中轉換資料。 資料流程中的轉換元素用來計算輸出欄位的值。 您可以在資料流程轉換中使用輸入欄位、可用的運算、資料型別與型別轉換。
資料流程轉換元素用於計算輸出欄位的值:
inputs: [
'*.Max' // - $1
'*.Min' // - $2
]
output: 'ColorProperties.*'
expression: '($1 + $2) / 2'
關於轉換,您需要了解以下幾個面向:
- 輸入欄位的參考方式:如何在轉換公式中參考輸入欄位中的值。
- 可用的運算:可在轉換中使用的運算。 例如,加法、減法、乘法與除法。
- 資料型別:公式可處理與操作的資料型別。 例如,整數、浮點數與字串。
- 型別轉換:在輸入欄位值、公式評估與輸出欄位之間,資料型別如何進行轉換。
輸入欄位
在轉換中,公式可以對靜態值 (例如數字 25) 或來自輸入欄位的參數進行運算。 對應會定義這些公式可存取的輸入欄位。 每個欄位都會依其在輸入清單中的順序進行參考:
inputs: [
'*.Max' // - $1
'*.Min' // - $2
'*.Mid.Avg' // - $3
'*.Mid.Mean' // - $4
]
output: 'ColorProperties.*'
expression: '($1, $2, $3, $4)'
在此範例中,轉換結果會產生一個陣列,包含 [Max, Min, Mid.Avg, Mid.Mean] 的值。 YAML 檔案中的註解 (# - $1、# - $2) 為選用項目,但有助於釐清每個欄位屬性與其在轉換公式中角色之間的關聯。
資料類型
不同的序列化格式支援各種資料型別。 例如,JSON 提供幾種基本型別:字串、數值、布林值,以及 null。 它也包含這些基本型別的陣列。
當對應程式讀取輸入屬性時,會將其轉換為內部型別。 此轉換是必要的,用以在資料寫入輸出欄位之前,將資料保留在記憶體中。 無論輸入與輸出的序列化格式是否相同,都會進行轉換為內部型別的處理。
內部表示法使用下列資料型別:
| 類型 | 描述 |
|---|---|
bool |
邏輯 true/false。 |
integer |
以 128 位元帶正負號整數儲存。 |
float |
以 64 位元浮點數儲存。 |
string |
UTF-8 字串。 |
bytes |
二進位資料,由 8 位元無號值組成的字串。 |
datetime |
具有奈秒解析度的 UTC 或本機時間。 |
time |
具有奈秒解析度的一天中的時間。 |
duration |
具有奈秒解析度的持續時間。 |
array |
由上述任一型別所組成的陣列。 |
map |
由上述任一型別所組成的 (索引鍵, 值) 配對向量。 |
輸入記錄欄位
讀取輸入記錄欄位時,其基礎型別會轉換為上述其中一種內部型別變體。 內部表示法具備足夠的彈性,可在幾乎不需或完全不需轉換的情況下處理大多數輸入型別。
對於某些格式,會使用替代型別。 例如,JSON 沒有 datetime 型別,而是將 datetime 值以符合 ISO8601 格式的字串來儲存。 當對應程式讀取這類欄位時,內部表示法仍會維持為字串。
輸出記錄欄位
對應程式的設計具備彈性,會將內部型別轉換為輸出型別,以因應資料來自型別系統受限的序列化格式之情境。 以下範例顯示轉換的處理方式:
-
數值型別:這些型別可以轉換為其他表示方式,即使這代表會失去精確度。 例如,64 位元浮點數 (
f64) 可以轉換為 32 位元整數 (i32)。 -
字串轉為數值:如果傳入的記錄包含像
123這樣的字串,而輸出欄位是 32 位元整數,對應程式會將該值轉換並以數值形式寫入。 -
字串轉為其他型別:
- 如果輸出欄位是
datetime,對應程式會嘗試將字串解析為 ISO8601 格式的datetime。 - 如果輸出欄位是
binary/bytes,對應程式會嘗試將該字串從 base64 編碼的字串進行反序列化。
- 如果輸出欄位是
-
布林值:
- 如果輸出欄位是數值型別,會轉換為
0/1。 - 如果輸出欄位是字串,會轉換為
true/false。
- 如果輸出欄位是數值型別,會轉換為
在轉換公式中使用型別
在對應中,可以選擇性地指定公式,說明在將資料寫入輸出欄位之前,如何處理來自輸入的資料。 如果未指定公式,對應程式會依據內部型別與轉換規則,將輸入欄位直接複製到輸出。
如果指定了公式,可在公式中使用的資料型別僅限於:
- 整數
- 浮點數
- 字串
- 布林值
- 前述型別的陣列
- 缺失值
Map 與 byte 不能參與公式運算。
與時間相關的型別 (datetime、time 及 duration) 會轉換為代表秒數的整數值。 在公式評估完成後,結果會儲存在內部表示法中,而不會再轉換回原型別。 例如,datetime 轉換為秒數後,會維持為整數。 如果該值將用於 datetime 欄位,則必須套用明確的轉換方法。 其中一個範例是將該值轉換為 ISO8601 字串,系統會自動將其轉換為輸出序列化格式中的 datetime 型別。
使用非規則型別
對於像是陣列與缺失值這類型別,需有特別考量。
陣列
陣列可以透過彙總函式來處理,從多個元素中計算出單一值。 例如,使用以下輸入記錄:
{
"Measurements": [2.34, 12.3, 32.4]
}
搭配此對應設定:
inputs: [
'Measurements' // - $1
]
output: 'Measurement'
expression: 'min($1)'
此設定會從 Measurements 陣列中選取最小的值,作為輸出欄位。
也可以由多個單一值建立陣列:
inputs: [
'minimum' // - - $1
'maximum' // - - $2
'average' // - - $3
'mean' // - - $4
]
output: 'stats'
expression: '($1, $2, $3, $4)'
此對應會建立一個陣列,包含最小值、最大值、平均值與均值。
缺失值
缺失值是一種特殊型別,適用於下列情境,例如:
- 在輸入中處理缺少的欄位,並提供替代值。
- 根據欄位是否存在,有條件地移除欄位。
使用缺失值的範例對應:
{
"Employment": {
"Position": "Analyst",
"BaseSalary": 75000,
"WorkingHours": "Regular"
}
}
輸入記錄包含 BaseSalary 欄位,但該欄位可能是選用的。 假設如果該欄位不存在,則必須從情境化資料集新增一個值:
{
"Position": "Analyst",
"BaseSalary": 70000,
"WorkingHours": "Regular"
}
對應可以檢查該欄位是否存在於輸入記錄中。 如果找到該欄位,輸出就會接收該既有值。 否則,輸出會接收來自情境資料集的值。 例如:
inputs: [
'BaseSalary' // - - - - - - - - - - - $1
'$context(position).BaseSalary' // - $2
]
output: 'BaseSalary'
expression: 'if($1 == (), $2, $1)'
conversion 會使用 if 函式,該函式具有三個參數:
- 第一個參數是條件。 在此範例中,它會檢查輸入欄位 (別名為
$1) 的BaseSalary欄位是否為缺失值。 - 第二個參數是在第一個參數條件為 true 時的函式結果。 在此範例中,這是情境化資料集 (別名為
$2) 的BaseSalary欄位。 - 第三個參數是在第一個參數條件為 false 時所使用的值。
可用的函數
資料流程提供一組內建函式,可用於轉換公式中。 這些函式可用來執行常見作業,例如算術、比較與字串操作。 可用的函式如下:
| 函式 | 描述 | 範例 |
|---|---|---|
min |
從陣列中傳回最小值。 |
min(2, 3, 1) 會傳回 1,min($1) 會傳回陣列 $1 中的最小值 |
max |
從陣列中傳回最大值。 |
max(2, 3, 1) 會傳回 3,max($1) 會傳回陣列 $1 中的最大值 |
if |
根據條件傳回不同的值。 |
if($1 > 10, 'High', 'Low') 如果 $1 大於 10 則傳回 'High',否則傳回 'Low' |
len |
傳回字串的字元長度或元組中的元素數量。 |
len("Azure") 會傳回 5,len(1, 2, 3) 會傳回 3,len($1) 會傳回陣列 $1 中的元素數量 |
floor |
傳回小於或等於該數值的最大整數。 |
floor(2.9) 會傳回 2 |
round |
將數值四捨五入為最接近的整數,介於中間的情況會向遠離 0.0 的方向進位。 |
round(2.5) 會傳回 3 |
ceil |
傳回大於或等於數值的最小整數。 |
ceil(2.1) 會傳回 3 |
scale |
將數值從一個範圍縮放到另一個範圍。 |
scale($1, 0, 10, 0, 100) 會將輸入值從 0 到 10 的範圍縮放到 0 到 100 的範圍 |
轉換函數
資料流程提供多個內建的轉換函式,可用於常見的單位轉換,例如溫度、壓力、長度、重量和體積。 這裡有一些範例:
| 轉換 | 公式 | 函式名稱 |
|---|---|---|
| 攝氏轉華氏 | F = (C * 9/5) + 32 | cToF |
| PSI 轉 bar | Bar = PSI * 0.0689476 | psiToBar |
| 英吋轉公分 | 公分 = 英吋 * 2.54 | inToCm |
| 英尺轉公尺 | 公尺 = 英尺 * 0.3048 | ftToM |
| 磅轉公斤 | 公斤 = 磅數 * 0.453592 | lbToKg |
| 加侖轉公升 | 公升 = 加侖 * 3.78541 | galToL |
也支援反向轉換:
| 轉換 | 公式 | 函式名稱 |
|---|---|---|
| 華氏轉攝氏 | C = (F - 32) * 5/9 | fToC |
| Bar 轉 PSI | PSI = bar / 0.0689476 | barToPsi |
| 公分轉英吋 | 英吋 = 公分 / 2.54 | cmToIn |
| 公尺轉英尺 | 英尺 = 公尺 / 0.3048 | mToFt |
| 公斤轉磅 | 磅 = 公斤 / 0.453592 | kgToLb |
| 公升轉加侖 | 加侖 = 公升 / 3.78541 | lToGal |
此外,您也可以使用基本的數學公式來定義自己的轉換函式。 系統支援加法 (+)、減法 (-)、乘法 (*) 與除法 (/) 等運算子。 這些運算子遵循標準的優先順序規則,您可以使用括號來調整,以確保正確的運算順序。 這可讓您自訂單位轉換以符合特定需求。
依優先順序提供的可用運算子
| 操作員 | 描述 |
|---|---|
| ^ | 指數運算:$1 ^ 3 |
由於 Exponentiation 具有最高的優先順序,除非以括號覆寫此順序,否則會先執行:
-
$1 * 2 ^ 3會解讀為$1 * 8,因為2 ^ 3的部分會在乘法之前先執行。 -
($1 * 2) ^ 3會先處理乘法,再進行指數運算。
| 操作員 | 描述 |
|---|---|
| - | 否定 |
| ! | 邏輯 NOT |
Negation 與 Logical not 具有較高的優先順序,因此通常會緊貼其相鄰的運算元,除非涉及指數運算:
-
-$1 * 2會先對$1取負值,然後再相乘。 -
-($1 * 2)會先相乘,然後再對結果取負值。
| 操作員 | 描述 |
|---|---|
| * | 乘法:$1 * 10 |
| / | 除法:$1 / 25 (若兩個引數皆為整數,結果為整數,否則為浮點數) |
| % | 取餘數:$1 % 25 |
Multiplication、Division 與 Modulo 具有相同的優先順序,除非使用括號改變順序,否則會由左至右依序執行。
| 操作員 | 描述 |
|---|---|
| + | 數值的加法,字串的串接 |
| - | 減 |
Addition 與 Subtraction 相較於前一組運算屬於較低優先順序:
-
$1 + 2 * 3的結果為$1 + 6,因為2 * 3由於multiplication具有較高的優先順序而先執行。 -
($1 + 2) * 3會先執行Addition,再執行Multiplication。
| 操作員 | 描述 |
|---|---|
| < | 小於 |
| > | 大於 |
| <= | 小於或等於 |
| >= | 大於或等於 |
| == | 等於 |
| != | 不等於 |
Comparisons 運算會作用於數值、布林值與字串值。 由於其優先順序低於算術運算子,因此不需要使用括號即可正確比較結果:
-
$1 * 2 <= $2等同於($1 * 2) <= $2。
| 操作員 | 描述 |
|---|---|
| || | 邏輯 OR |
| && | 邏輯 AND |
邏輯運算子用於串接條件:
$1 > 100 && $2 > 200