共用方式為


使用資料流程轉換來轉換資料

重要事項

本頁包含使用 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

在轉換公式中使用型別

在對應中,可以選擇性地指定公式,說明在將資料寫入輸出欄位之前,如何處理來自輸入的資料。 如果未指定公式,對應程式會依據內部型別與轉換規則,將輸入欄位直接複製到輸出。

如果指定了公式,可在公式中使用的資料型別僅限於:

  • 整數
  • 浮點數
  • 字串
  • 布林值
  • 前述型別的陣列
  • 缺失值

Mapbyte 不能參與公式運算。

與時間相關的型別 (datetimetimeduration) 會轉換為代表秒數的整數值。 在公式評估完成後,結果會儲存在內部表示法中,而不會再轉換回原型別。 例如,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) 會傳回 1min($1) 會傳回陣列 $1 中的最小值
max 從陣列中傳回最大值。 max(2, 3, 1) 會傳回 3max($1) 會傳回陣列 $1 中的最大值
if 根據條件傳回不同的值。 if($1 > 10, 'High', 'Low') 如果 $1 大於 10 則傳回 'High',否則傳回 'Low'
len 傳回字串的字元長度或元組中的元素數量。 len("Azure") 會傳回 5len(1, 2, 3) 會傳回 3len($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

NegationLogical not 具有較高的優先順序,因此通常會緊貼其相鄰的運算元,除非涉及指數運算:

  • -$1 * 2 會先對 $1 取負值,然後再相乘。
  • -($1 * 2) 會先相乘,然後再對結果取負值。
操作員 描述
* 乘法:$1 * 10
/ 除法:$1 / 25 (若兩個引數皆為整數,結果為整數,否則為浮點數)
% 取餘數:$1 % 25

MultiplicationDivisionModulo 具有相同的優先順序,除非使用括號改變順序,否則會由左至右依序執行。

操作員 描述
+ 數值的加法,字串的串接
-

AdditionSubtraction 相較於前一組運算屬於較低優先順序:

  • $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