Azure Stream Analytics ジョブ向けの .NET Standard ユーザー定義関数を開発する (廃止)

Important

.NET Standard ユーザー定義関数はAzure Stream Analytics用に2024年9月30日に廃止されました。 この機能は現在利用できません。 Azure Stream Analytics のJavaScriptユーザー定義関数に移行してください。

Azure Stream Analytics には、イベント データのストリームに対して変換と計算を実行するための SQL に似たクエリ言語が用意されています。 この言語には多くの組み込み関数が含まれていますが、複雑なシナリオではより柔軟性が求められます。 .NET Standardのユーザー定義関数(UDF)を使用することで、任意の.NET標準言語(例:C#やF#)で書かれた独自の関数を呼び出してStream Analyticsクエリ言語を拡張できます。 UDFを使って複雑な数学計算を行い、ML.NETを使ったカスタムMLモデルをインポートし、不足データに対してカスタム補補ロジックを用いましょう。

この機能は廃止されているため、この記事を使って.NET標準UDFの動作を理解し、JavaScriptユーザー定義関数への移行計画を立てましょう。

.NET標準ユーザー定義関数について

.NET標準UDFはストリームアナリティクスクエリ言語をカスタムロジックで拡張します。 UDFを構築する前に、その機能が動作するリージョン、使用するパッケージパス、サポートされている型マッピング、機能制限を確認しましょう。

Azure Stream Analyticsは、Stream Analyticsクラスター上で動作するクラウドジョブに対して.NETユーザー定義関数機能を有効にします。 標準のマルチテナントSKU上で動作するジョブは、以下の公開領域でこの機能を利用できます:

  • 米国中西部
  • 北ヨーロッパ
  • 米国東部
  • 米国西部
  • 米国東部 2
  • 西ヨーロッパ

この機能を他の地域で使用するには 、アクセスをリクエストしてください。

UDF パッケージの形式には、パス /UserCustomCode/CLR/*があります。 Azure Stream Analytics/UserCustomCode/CLR/*フォルダの下に動的リンクライブラリ(DLL)やリソースをコピーし、ユーザーDLLをシステムおよびAzure Stream AnalyticsのDLLから分離するのに役立ちます。 すべての関数は、どのように使うかに関わらずこのパッケージパスを使用します。

C# で Azure Stream Analytics の値を使用するには、ある環境から他方の環境にマーシャリングする必要があります。 マーシャリングは、UDF のすべての入力パラメーターに対して行われます。 すべてのAzure Stream Analyticsタイプは、以下の表に示されるC#に対応するタイプを持っています。

Azure Stream Analytics の種類 C# 型
bigint long
float double
nvarchar(max) 文字列
datetime DateTime
記録 辞書の文字列<目的語>
Array Object[]

これは、UDF の出力値で発生するデータを C# から Azure Stream Analytics にマーシャリングする必要がある場合にも当てはまります。 以下の表は、対応されるタイプを示しています。

C# 型 Azure Stream Analytics の種類
long bigint
double float
文字列 nvarchar(max)
DateTime dateTime
構造体 記録
オブジェクト 記録
Object[] Array
辞書の文字列<目的語> 記録

UDF機能には以下の制限があります:

  • .NET Standard UDFはVisual Studio CodeまたはVisual Studioでのみ作成でき、その後Azureに公開できます。 Azureポータルの関数欄で、読み込み専用のバージョンの.NET Standard UDFを見ることができます。 Azureポータルは.NET標準関数の作成をサポートしていません。
  • Azureポータルクエリエディターで.NET Standard UDFを使うとエラーが表示されます。
  • リバースIPルックアップや外部ソースからの参照データ取得など、外部のRESTエンドポイントに呼び出しすることもできません。
  • カスタムコードはAzure Stream Analyticsエンジンとコンテキストを共有するため、カスタムコードはAzure Stream Analyticsコードと名前空間やDLL名が競合するものを参照できません。 例えば、 Newtonsoft.Jsonを参照することはできません。
  • Azure Stream Analyticsはプロジェクト内の支援ファイルを、ジョブをクラウドに公開する際に使用するユーザーカスタムコードのzipファイルにコピーします。 解凍時には、サブフォルダ内のすべてのファイルがクラウド内のユーザーカスタムコードフォルダのルートに移動します。 解凍するとzipファイルがフラットになります。
  • ユーザー カスタム コードでは、空のフォルダーはサポートされていません。 プロジェクト内のサポート ファイルに空のフォルダーを追加しないでください。

Visual Studio Code で UDF を開発する

Azure Stream Analytics 用の Visual Studio Code ツール を使用すると、UDF の記述、ローカルでのジョブのテスト (オフラインでも可能)、Stream Analytics ジョブの Azure への発行を簡単に行うことができます。 .NET標準のUDFは、ローカルプロジェクトやローカルDLLからVisual Studio Codeに実装できます。 ユーザー定義関数を含むローカル DLL を参照することもできます。

手続き論理や再帰など、表現言語を超えた.NET標準言語のフルパワーを必要とする複雑な関数にはローカルプロジェクトを活用してください。 ローカルプロジェクトは、複数のAzure Stream Analyticsクエリで関数ロジックを共有する必要がある場合にも役立ちますし、ローカルで関数のデバッグやテストが可能です。 以下の例では、CSharpUDFProjectはC#クラスライブラリプロジェクトであり、ASAUDFDemoはAzure Stream Analyticsプロジェクトで、CSharpUDFProjectを参照しています。

  1. ローカルマシンで新しい.NET Standardクラスライブラリを作成しましょう。

    Visual Studio CodeでのAzure Stream Analyticsプロジェクトのスクリーンショット。

  2. クラスにコードを記述します。 クラスを パブリック 、オブジェクトを 静的パブリックとして定義します。 次のUDFは、整数をそれ自体で乗算して、その整数の二乗を求めます。

    using System;
    
    namespace CSharpUDFProject
    {
       //
        public class Class1
        {
            public static Int64 SquareFunction(Int64 a)
            {
                return a * a;
            }
        }
    }
    
  3. Azure Stream Analyticsプロジェクトに新しいC#関数設定ファイルを追加し、C#クラスライブラリプロジェクトを参照してください。 関数を追加するには、 Functions フォルダを選択して長押し(または右クリック)し、「 Add Item」を選択してください。

    Azure Stream Analyticsプロジェクトで新しい関数を追加するスクリーンショットです。

  4. C# 関数 SquareFunction を Azure Stream Analytics プロジェクトに追加します。

    VS CodeのStream AnalyticsプロジェクトからC#関数を選択するスクリーンショットです。

  5. C#関数名を入力してください。

    Visual Studio CodeでC#関数名を入力するスクリーンショット。

  6. C#関数の設定で、ドロップダウンリストからC#プロジェクトを選択するために ライブラリのプロジェクトパス を選択し、プロジェクトを構築するために「 プロジェクトを構築 」を選択してください。 次に、[ クラスの選択 ] と [メソッドの選択 ] を選択して、関連するクラスとメソッド名をドロップダウン リストから選択します。 Stream Analyticsクエリのメソッド、型、関数を参照するために、クラスを パブリック 、オブジェクトを 静的パブリックと定義します。

    VS CodeにおけるStream Analytics C#関数構成のスクリーンショットです。

  7. DLL から C# UDF を使用するには、Choose library DLL path を選択して DLL を選択し、その後 Select classSelect method を選択します。

    ライブラリDLLのStream Analytics C#関数構成のスクリーンショットです。

  8. Azure Stream Analytics クエリで UDF を呼び出します。

     SELECT price, udf.SquareFunction(price)
     INTO Output
     FROM Input 
    
  9. ジョブ設定ファイルのCustomCodeStorageセクションでアセンブリパスをJobConfig.json設定してください。 このステップは局所検査には必要ありません。

  10. ジョブをAzureに提出する前に、JobConfig.jsonジョブ設定ファイルのCustomCodeStorageセクションでパッケージパスを設定してください。 CodeLensの 「サブスクリプションから選択 」を使ってサブスクリプションを選択し、ドロップダウンリストからストレージアカウントとコンテナ名を選択してください。 [パス] は既定値のままにします。 このステップは局所検査には必要ありません。

    Stream Analytics C#関数のためにストレージアカウントを設定する際のスクリーンショットです。

Visual Studio で UDF を開発する

Visual Studioでは、ASAプロジェクトのCodeBehindファイル、ローカルプロジェクトのUDF、またはAzureストレージアカウントの既存パッケージを使うことでUDFを実装できます。 以下の例では、UDFTestはC#クラスライブラリプロジェクトであり、ASAUDFDemoはAzure Stream Analyticsプロジェクトで、UDFTestを参照しています。

CodeBehindオプションについては、 Script.asql のCodeBehindファイルにユーザー定義関数を書き込みます。 Visual StudioのツールはCodeBehindファイルを自動的にアセンブリファイルにコンパイルします。 ツールはアセンブリをzipファイルとしてパッケージ化し、Azureにジョブを送信した際にストレージアカウントにアップロードします。 CodeBehindを使ってC# UDFを書く方法を学びたい方は、 C# UDF for Stream Analytics Edgeのジョブチュートリアル に従ってください。

  1. ソリューション内で新しい.NET標準クラスライブラリを作成します。

    Visual Studio年のAzure Stream Analytics IoT Edgeプロジェクトのスクリーンショットです。

  2. クラスにコードを記述します。 クラスを パブリック 、オブジェクトを 静的パブリックとして定義します。

  3. プロジェクトをビルドする。 ツールはbinフォルダ内のすべてのアーティファクトをzipファイルにまとめ、そのzipファイルをストレージアカウントにアップロードします。 外部参照の場合は、NuGetパッケージの代わりにアセンブリ参照を使いましょう。

  4. Azure Stream Analytics プロジェクトの新しいクラスを参照します。

  5. Azure Stream Analytics プロジェクトに新しい関数を追加します。

  6. ジョブ設定ファイルでアセンブリパスを設定 JobConfig.json 。 アセンブリパスをLocal Project ReferenceまたはCodeBehindに設定してください。

  7. 関数プロジェクトと Azure Stream Analytics プロジェクトの両方をリビルドします。

  8. C#プロジェクトを構築して、Azure Stream AnalyticsクエリからC# UDFへの参照を追加できるようにしてください。

    Visual Studio で Azure Stream Analytics IoT Edge プロジェクトを構築しているスクリーンショット。

  9. ASA プロジェクトの C# プロジェクトへの参照を追加します。 参照 ノードを選択して 長押し(または右クリック)し、次に 参照を追加してください。

    Visual StudioでC#プロジェクトへの参照を追加するスクリーンショットです。

  10. 一覧から C# プロジェクト名を選択します。

    Visual StudioのリファレンスリストからC#プロジェクト名を選ぶスクリーンショットです。

  11. UDFTestソリューション エクスプローラー参照項目に表示されているか確認してください。

    Visual Studioのソリューション エクスプローラーにおけるユーザー定義関数参照のスクリーンショットです。

  12. Functionsフォルダを選択して長押し(または右クリック)し、「新しいアイテム」を選択してください。

    Azure Stream Analytics EdgeソリューションでFunctionsに新しいアイテムを追加するスクリーンショット。

  13. Azure Stream Analytics プロジェクト C# 関数SquareFunction.jsonを追加します。

    Visual StudioでStream Analytics EdgeのアイテムからC#関数を選択するスクリーンショットです。

  14. ソリューション エクスプローラーの機能を開いて設定ダイアログを表示します。

    Visual StudioのC#関数設定ダイアログのスクリーンショットです。

  15. C# 関数の構成で、ドロップダウン リスト から[ASA プロジェクト参照からロード ]を選択し、関連するアセンブリ、クラス、およびメソッド名を選択します。 Stream Analyticsクエリのメソッド、型、関数を参照するために、クラスを パブリック 、オブジェクトを 静的パブリックと定義します。

    Visual StudioのStream Analytics C#関数構成のスクリーンショットとASAプロジェクト参照付きです。

既存の.NET標準UDFパッケージを設定

どのIDEでも.NET標準UDFを作成し、Azure Stream Analyticsクエリから呼び出すことができます。 アセンブリのzipパッケージをAzureストレージアカウントにアップロードした後、Stream Analyticsのジョブ設定にストレージ情報を含めることで、Azure Stream Analyticsクエリの機能を利用できます。 このオプションではローカルで関数をテストできません。なぜならVisual Studioのツールはパッケージをダウンロードしないからです。 サービスはパッケージパスを直接解析します。 既存のパッケージを使うには:

  1. コードをコンパイルし、すべてのDLLをパス /UserCustomCode/CLR/*を使ってパッケージ化します。

  2. UserCustomCode.zipをAzureストレージアカウントのコンテナのルートにアップロードしてください。

  3. JobConfig.jsonジョブ構成ファイルで User-Defined コード構成セクションを展開します。

  4. 以下の推奨値で構成を記入してください。

    Setting 推奨値
    グローバル ストレージ設定リソース 現在のアカウントからデータ ソースを選択する
    グローバル ストレージ設定サブスクリプション < サブスクリプション >
    グローバルストレージ設定 ストレージアカウント < ストレージ アカウント >
    カスタム コード ストレージ設定リソース 現在のアカウントからデータ ソースを選択する
    カスタムコードのストレージ設定用ストレージ・アカウント < ストレージ アカウント >
    カスタム コード ストレージ設定コンテナー < あなたのストレージ コンテナー >
    カスタム コード アセンブリ ソース クラウドからの既存のアセンブリ パッケージ
    カスタム コード アセンブリ ソース UserCustomCode.zip

StreamingContextクラスでカスタム情報をログする

ログ機構を使うことで、ジョブ実行中にカスタム情報を取得できます。 ログデータを使ってカスタムコードの正しさをリアルタイムでデバッグまたは評価しましょう。 ログメッセージを公開・アクセスするには以下の手順をご利用ください:

  1. StreamingContextクラスを使ってStreamingDiagnostics.WriteError関数を使って診断情報を公開します。 以下のコードは、Azure Stream Analyticsが公開するインターフェースを示しています。

    public abstract class StreamingContext
    {
        public abstract StreamingDiagnostics Diagnostics { get; }
    }
    
    public abstract class StreamingDiagnostics
    {
        public abstract void WriteError(string briefMessage, string detailedMessage);
    }
    
  2. StreamingContextをUDFメソッドの入力パラメータとして渡し、UDF内でカスタムログ情報を公開するために使います。 次の例では、MyUdfMethod はクエリが提供するデータ入力と、実行時エンジンが提供するStreamingContextとしてコンテキスト入力を定義しています。

    public static long MyUdfMethod(long data, StreamingContext context)
    {
        // write log
        context.Diagnostics.WriteError("User Log", "This is a log message");
    
        return data;
    }
    
  3. クエリからUDFを呼び出してください。 SQLクエリでStreamingContext値を渡す必要はありません。なぜなら、入力パラメータがあればAzure Stream Analytics自動的にコンテキストオブジェクトを提供してくれるからです。 MyUdfMethodの使用は変わっていません。これは以下のクエリで示されています。

    SELECT udf.MyUdfMethod(input.value) as udfValue FROM input
    
  4. 診断ログを通じてログメッセージにアクセスします。