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