データ フロー グラフでマップを使用してデータを変換する

Azure IoT Operationsでは、マップ変換がデータフローグラフ内の各受信メッセージを、あなたのルールに基づいて出力メッセージを生成します。 フィールドの名前変更、新しい構造への再構成、派生値の計算、不要なフィールドの削除を行うことができます。 ワイルドカードルールを使うことで、すべてのフィールドを一度にコピーできます。

データ フロー グラフの概要と、パイプラインでの変換の構成方法については、 データ フロー グラフの概要に関するページを参照してください。

変換は式言語を用いて値、テスト条件、参照フィールドを計算します。 式は名前ではなく位置で入力を参照します。 inputs リストの最初の入力は $1、2番目は $2、という具合です。 cToFのような組み込み関数がこれらの値を変換・操作します。

演算子、関数、データ型、メタデータフィールドの完全なリストについては 、Expressionsリファレンスを参照してください。

前提条件

  • Kubernetes クラスターにデプロイされた Azure IoT Operations のインスタンス。 詳細については、「Deploy Azure IoT Operations」をご覧ください。
  • defaultを指すmcr.microsoft.comという名前の既定のレジストリ エンドポイントは、デプロイ時に自動的に作成されます。 組み込みの変換では、このエンドポイントが使用されます。

この記事のAzure CLI例は環境変数を使っており、各値を一度設定してからコマンドをコピー&ペーストできます as-is。 クイックスタートのAzure IoT Operations Codespaces環境を使っている場合、これらの変数はすでに設定済みなので、このステップを省略できます。 そうでなければ、コマンドを実行する前にシェル内で以下の環境変数を設定してください。

以下のスクリプトは、最も一般的に使われる環境変数を設定します。

環境変数 説明
SUBSCRIPTION_ID Azure IoT Operationsインスタンスを含むサブスクリプションのIDです。
RESOURCE_GROUP あなたのAzure IoT Operationsインスタンスを含むリソースグループの名前です。
AIO_INSTANCE_NAME あなたのAzure IoT Operationsインスタンスの名前です。 インスタンスを挙げるには、 az iot ops list -o tableを実行してください。
CLUSTER_NAME あなたのインスタンスをホストしているAzure Arc対応のKubernetesクラスターの名前です。
LOCATION 例えばeastusなど、新しい資源を活用するためのAzure地域。
SUBSCRIPTION_ID=<subscription-id>
RESOURCE_GROUP=<resource-group-name>
AIO_INSTANCE_NAME=<instance-name>
CLUSTER_NAME=<cluster-name>
LOCATION=<region>

この記事で使っている変数を設定するだけで十分です。 この記事では、選択したリソース名に追加の環境変数を使う場合があります。 記事では、導入された場所の位置をどう設定するか説明しています。

マップ ルールのしくみ

各マップ ルールには、次の 4 つの部分があります。

財産 必須 説明
inputs はい 受信メッセージから読み取るフィールド パスの一覧。
output はい フィールドパスで、結果が出力メッセージに現れます。
expression いいえ 入力値に適用される数式。 もし省略すると、最初の入力値が直接コピーされます。
description いいえ ルールの人間が理解できるラベルがエラーメッセージに含まれています。

マップ変換は入力に位置変数を順番に割り当てます。 例えば、 inputs['Position', 'Office']であれば、 $1Position の値、 $2Officeの値です。

フィールドの名前を変更する

BirthDateの名前をDateOfBirthに変更するには、1 つの入力を別の出力パスにマップします。 表現なんていらないよ。 値はそのままコピーします。

マップ変換の構成で、次の規則を追加します。

Setting 価値
入力 BirthDate
アウトプット DateOfBirth

フィールドを再構築する

フィールドを入れ子構造に移動するには、出力パスでドット表記を使用します。

次の 2 つのルールを追加します。

入力 アウトプット
Name Employee.Name
BirthDate Employee.DateOfBirth

次の入力を与える

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

次の 2 つのルールが生成されます。

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

ルールの出力に一覧表示されているフィールドのみが結果に表示されます。 結果には Position フィールドが含まれません。なぜなら、そのフィールドをマッピングするルールが存在しないためです。

複数の入力を結合する

複数の入力をリストアップするときは、それらの位置変数を使って式に統合します。

ルールを追加します。

Setting 価値
入力 PositionOffice
アウトプット Employment.Position
$1 + ", " + $2

Position: "Analyst"Office: "Kent, WA"を指定すると、出力は"Analyst, Kent, WA"

式を使用して値を変換する

expression フィールドを使用して、組み込みの関数または算術演算を適用します。 以下の例では、セルシウス値を華氏に変換する組み込みの単位変換関数 cToFを使用しています。 「 $1 はフィールド名ではなく最初の入力を指すことを覚えておいてください。」

演算子、関数、高度な機能の完全なリストについては、 Expressions referenceを参照してください。 参照グループは 単位変換スケーリングと四捨五入数学文字列 関数などのカテゴリごとに機能します。

コンピューティング ルールを追加します。 たとえば、摂氏を華氏に変換するには、次のようにします。

Setting 価値
入力 temperature
アウトプット temperature_f
cToF($1)

センサーの読み取り値を 0 ~ 100 の範囲にスケーリングするには、式 scale($1, 0, 4095, 0, 100)を使用します。

ワイルドカードを使用してすべてのフィールドをコピーする

出力が少数の変更のみで入力と密接に一致する必要がある場合は、ワイルドカードルールを使用してすべてのフィールドを一度にコピーします。 次に、特定のフィールドをオーバーライド、追加、または削除するルールを追加します。

すべてのフィールドをコピーするパススルー 規則を追加します。 入力を * に設定し、出力を * に設定します。

ワイルドカード 規則の要件

  • ワイルドカード ルールは、マップ構成の 最初のルール である必要があります。
  • マップ変換はワイルドカードルールを1つだけサポートします。
  • アスタリスクは 1 つ以上のパス セグメントと一致し、完全なセグメントを表す必要があります。 マップ変換は partial*のような部分的なパターンをサポートしていません。

プレフィックスワイルドカード

ワイルドカードを特定のプレフィックスにスコープします。 すべてのフィールドを ColorProperties からルート レベルにフラット化するには:

入力 ColorProperties.* と出力 *を含むルールを追加します。

たとえば、以下のように指定したとします。

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

出力は次のようになります。

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

出力からフィールドを削除する

特定のフィールドを除外するには、 output を空の文字列に設定します。 通常はワイルドカードルールの後にこの方法を使いましょう:すべてコピーし、不要なものは削除します。

  1. すべてのフィールドをコピーするパススルー 規則を追加します。
  2. 削除ルールを追加し、除外するフィールド ( passwordinternal_idなど) を選択します。

削除ルールには表現を含めることはできません。

特定のフィールドのワイルドカードをオーバーライドする

ワイルドカードルールと特定のルールの両方が同じフィールドと一致する場合は、より具体的なルールが優先されます。

  1. すべてのフィールドをコピーするパススルー 規則を追加します。
  2. temperatureを使用してcToF($1)の計算ルールを追加します。

マップ変換は、特定のルールを temperature に適用し、他のすべてのフィールドを as-isコピーします。

メタデータ フィールドを使用する

MQTTトピックやユーザープロパティなどのメッセージメタデータから読み書きできます。 式リファレンスの メタデータ フィールド を参照してください。

MQTT ユーザー プロパティにフィールド値を書き込むには、入力 region と出力 $metadata.user_property.region を含むルールを追加します。

動的トピック・ルーティングの完全な例については、 メッセージを別のトピックにルーティングするを参照してください。

最後の既知の値と既定値を使用する

センサー データが断続的に到着すると、不足しているフィールドに最後の既知の値または静的な既定値を入力できます。 式リファレンスの 最後の既知の値既定値 を参照してください。

temperature フィールドのルールを追加し、[最後の既知の] を有効にします。 フォールバックとして既定値の 0 を設定します。

この規則では、現在の値が存在する場合に使用され、最後の既知の値にフォールバックし、どちらも使用できない場合は 0 を使用します。

外部データを使用してエンリッチする

エンリッチメントは任意です。 これは、受信メッセージとステートストアに保存されている参照データ(例えばデバイスメタデータのルックアップテーブル)を組み合わせたい場合だけです。 もしメッセージにすでに必要なものが含まれているなら、このセクションは飛ばしてください。

エンリッチメントが必要なら、処理中にランタイムが参照する コンテキスト化データセット を設定してください。 たとえば、デバイスのメタデータを ID で検索し、出力に含めます。 詳細については、「 外部データを使用したエンリッチメント」を参照してください。

データ フロー グラフの排他機能

データ フロー グラフでは、データ フロー builtInTransformation マッピングでは使用できないいくつかの機能がサポートされています。

見つからないフィールドの既定値

フィールドがない場合に静的フォールバックを提供するには、入力に対して ?? <default> 構文を使用します。 これは、空の値をチェックする if 式を記述するよりも簡単です。

マップ変換の構成で、 ?? 構文の後に既定値を含むように入力を設定します。 たとえば、温度フィールドがない場合にtemperature ?? 0を使用する入力フィールドとして「0」と入力します。

サポートされている既定の型と、既定値と最後の既知の値の組み合わせの詳細については、式リファレンスの 既定値 を参照してください。

Regex 関数

データ フロー グラフでは、正規表現の照合と置換がサポートされています。

  • str::regex_matches(string, pattern): 文字列が正規表現パターンと一致する場合は true を返します。
  • str::regex_replace(string, pattern, replacement): すべての正規表現の一致を置換文字列に置き換えます。

これらの関数は、フィルター式や文字列データのクリーニングと変換に役立ちます。 文字列関数の完全な一覧については、式リファレンスの 「文字列関数 」を参照してください。

完全な構成の例

すべてのフィールドをコピーし、機密データを削除し、フィールドを再構築し、派生値を計算する完全なマップ構成を次に示します。

ワイルドカード、削除、再構築、コンピューティング、マージに関する複数のルールを示す操作エクスペリエンス マップ変換構成パネルのスクリーンショット。

操作エクスペリエンスで、データ フロー グラフを作成し、マップ変換を追加します。 マップ構成パネルで、次の規則を追加します。

  1. ワイルドカードパススルーを使用してすべてのフィールドをコピーします。
  2. passwordの出力を空に設定してsecret_keyします。
  3. フィールドを BirthDateEmployee.DateOfBirthします。
  4. temperature場上の式cToF($1)を用いて華氏変換を計算します。
  5. フィールドとPosition フィールドを数式Office$1 + ", " + $2します。