APPLY (Azure Stream Analytics)

Met de operator APPLY kunt u een tabelwaardefunctie aanroepen voor elke rij die wordt geretourneerd door een buitenste tabelexpressie van een query. De tabelwaardefunctie fungeert als de rechterinvoer en de buitenste tabelexpressie als de linkerinvoer. De rechterinvoer wordt geëvalueerd voor elke rij van de linkerinvoer en de geproduceerde rijen worden gecombineerd voor de uiteindelijke uitvoer. De lijst met kolommen die door de operator APPLY wordt geproduceerd, is de set kolommen in de linkerinvoer, gevolgd door de lijst met kolommen die wordt geretourneerd door de rechterinvoer.

Er zijn twee vormen van APPLY: CROSS APPLY en OUTER APPLY.

CROSS APPLY retourneert alleen rijen uit de buitenste tabel die een resultatenset produceren op basis van de tabelwaardefunctie. Het resultaat van een CROSS APPLY kan niet worden gebruikt als de doelwaarde van timestamp by. U kunt echter één Azure Stream Analytics-taak gebruiken waarmee cross apply wordt uitgevoerd en een tweede taak gebruiken om timestamp by uit te voeren.

OUTER APPLY retourneert zowel rijen die een resultatenset produceren als rijen die dat niet doen, met NULL-waarden in de kolommen die worden geproduceerd door de tabelwaardefunctie.

Er zijn twee tabelwaardefuncties beschikbaar in Azure Stream Analytics om het werken met de velden Matrix en Recordtype te vergemakkelijken. Dit zijn GetArrayElements en GetRecordProperties.

Syntaxis

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

Argumenten

input_name | input_alias

De naam of alias van de invoerstroom.

column_name

De naam van een kolom van de invoerstroom.

element_name

De naam van de nieuwe kolom met het resultaat van de tabelwaardefunctie.

Retourtypen

De uitvoer is een record met de initiële nettolading en een record 'element_name', die het resultaat van de tabelwaardefunctie bevat.

Voor de functie GetArrayElements is het resultaat een record met twee velden:

  • ArrayIndex: de index van het element in de matrix

  • ArrayValue: de waarde van het element in de matrix.

Voor de functie GetRecordProperties is het resultaat een record met twee velden:

  • PropertyName: de naam van de eigenschap in de record.

  • PropertyValue: de waarde van de eigenschap in de record.

Voorbeelden

In dit voorbeeld, waarbij het tolpoortscenario wordt uitgebreid, gaan we ervan uit dat auto's meer dan één kenteken kunnen hebben (bijvoorbeeld een auto die een aanhangwagen sleept, zou er twee hebben). Cross/outer apply kan worden gebruikt om deze matrix af te vlakken, dat wil zeggen één rij per nummerplaat krijgen.

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  
  

De query kan worden aangepast om outer apply te gebruiken om ook auto's zonder kenteken bij te houden.

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

Een ander voorbeeld met geneste matrices (matrix van matrices).

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