次の方法で共有


APPLY (Azure Stream Analytics)

APPLY 操作では、クエリの外部テーブル式によって返される行ごとにテーブル値関数を呼び出すことができます。 テーブル値関数は右入力として機能し、外部テーブル式は左入力として機能します。 ユーザー定義アプライヤーは、左側の入力から得られた各行について右側の入力を評価し、生成された行を結合したうえで、最終的な出力とします。 APPLY 操作によって生成される列のリストは、左入力の列のセットです。その後には、右入力によって返された列のリストが続きます。

APPLY には、CROSS APPLY と OUTER APPLY という 2 つの形式があります。

CROSS APPLY では、外部テーブルの行のうち、テーブル値関数から結果セットを生成する行のみが返されます。 CROSS APPLY の結果を TIMESTAMP BY のターゲット値として使用することはできません。 ただし、CROSS APPLY を実行する 1 つの Azure Stream Analytics ジョブを使用し、2 番目のジョブを使用して TIMESTAMP BY を実行できます。

OUTER APPLY では、結果セットを生成する行と生成しない行の両方が返されます。そのとき、テーブル値関数によって生成される列には NULL 値が設定されます。

配列型フィールドとレコード型フィールドの操作を容易にするために、Azure Stream Analytics で使用できるテーブル値関数は 2 つあります。 これらは GetArrayElementsGetRecordProperties です

構文

  
<input> {CROSS | OUTER} APPLY <elements_selector>  
  
<input> ::= input_name |  input_alias  
  
<elements_selector> ::=   
{GetArrayElements | GetRecordProperties} (<column_name>) AS element_name  
  

引数

input_name |input_alias

入力ストリームの名前または別名。

column_name

入力ストリームの列の名前。

element_name

テーブル値関数の結果を含む新しい列の名前。

戻り値の型

出力は、初期ペイロードとレコード 'element_name' を含むレコードです。このレコードには、テーブル値関数の結果が含まれます。

GetArrayElements 関数の場合、結果は 2 つのフィールドを含むレコードになります。

  • ArrayIndex: 配列内の要素のインデックス

  • ArrayValue: 配列内の要素の値。

GetRecordProperties 関数の場合、結果は 2 つのフィールドを含むレコードになります。

  • PropertyName: レコード内のプロパティの名前。

  • PropertyValue: レコード内のプロパティの値。

この例では、料金所のシナリオを拡張し、車が複数のナンバー プレートを持つことができます (たとえば、トレーラーを牽引する車には 2 つがあると仮定します)。 ここで、CROSS/OUTER APPLY を使用して、配列を平坦化 (つまり、ナンバー プレートごとに 1 行を取得) できます。

CREATE TABLE input(TollId nvarchar(max), EntryTime datetime, Licenses array)  
  
SELECT e.TollId, e.EntryTime, flat.ArrayValue AS licensePlate   
   FROM input AS e   
   CROSS APPLY GetArrayElements(e.Licenses) AS flat  
  

OUTER APPLY を使用するようにクエリを変更して、ナンバー プレートが取り付けられていない車両も追跡できます。

SELECT e.TollId, e.EntryTime,   
flat.ArrayValue AS licensePlate, flat.ArrayIndex AS licensePlateIndex  
   FROM input AS e   
   OUTER APPLY GetArrayElements(e.Licenses) AS flat  
  

入れ子になった配列 (配列の配列) を使用する別の例です。

WITH firstQuery AS (  
   SELECT input.TollId, input.EntryTime,   
   flat.ArrayIndex AS i1, flat.ArrayValue AS licenses   
      FROM input   
      CROSS APPLY GetArrayElements(input.ArrayOfArray) AS flat)  
  
SELECT firstQuery.TollId, firstQuery.EntryTime, firstQuery.i1,   
flat2.ArrayIndex AS i2, flat2.ArrayValue AS license  
   FROM firstQuery  
   CROSS APPLY GetArrayElements(firstQuery.licenses) AS flat2