Query's schrijven voor Azure Data Explorer
In dit artikel leert u hoe u de querytaal in Azure Data Explorer om basisquery's uit te voeren met de meest voorkomende operators. U krijgt ook te maken met enkele van de meer geavanceerde functies van de taal.
Vereisten
- Een Azure-abonnement. Maak een gratis Azure-account.
- Maak een cluster en database.
U kunt de query's in dit artikel op twee manieren uitvoeren:
Op de Azure Data Explorer hulpcluster dat we hebben ingesteld om te leren. Meld u aan bij het cluster met een organisatie-e-mailaccount dat lid is van Azure Active Directory.
Op uw eigen cluster met de StormEvents-voorbeeldgegevens. Zie Voor meer informatie Quickstart: Een cluster Azure Data Explorer database maken en Voorbeeldgegevens opnemen in Azure Data Explorer.
De set met voorbeeldgegevens StormEvents bevat gegevens van het weer afkomstig van de National Centers for Environmental Information.
Overzicht van de querytaal
Een query in Azure Data Explorer is een alleen-lezenaanvraag om gegevens te verwerken en resultaten te retourneren. De aanvraag wordt in tekst zonder opmaak gesteld, waarbij gebruik wordt gemaakt van een gegevensstroommodel dat is ontworpen om de syntaxis eenvoudig te kunnen lezen, schrijven en automatiseren. De query maakt gebruik van schema-entiteiten die zijn geordend in een hiërarchie die vergelijkbaar is SQL: databases, tabellen en kolommen.
De query bestaat uit een reeks query-instructies, met scheidingstekens door een puntkomma ( ), waarbij ten minste één instructie een tabellaire expressie-instructie is. Dit is een instructie die gegevens produceert die zijn gerangschikt in een tabel-achtige mesh van kolommen en ; rijen. De instructies in de tabellaire expressie van de query genereren de resultaten van de query.
De syntaxis van de tabellaire expressie-instructie heeft een tabellaire gegevensstroom van de ene tabellaire queryoperator naar de andere, beginnend met de gegevensbron (bijvoorbeeld een tabel in een database of een operator die gegevens produceert) en vervolgens door een reeks operatoren voor gegevenstransformatie te stromen die met elkaar zijn verbonden door het gebruik van het pipe-scheidingsteken | ().
De volgende query heeft bijvoorbeeld één instructie. Dit is een tabellaire expressie-instructie. De instructie begint met een verwijzing naar een tabel met de naam StormEvents (de database die als host voor deze tabel fungeert, is hier impliciet en maakt deel uit van de verbindingsgegevens). De gegevens (rijen) voor die tabel worden vervolgens gefilterd op de waarde van kolom StartTime en vervolgens gefilterd op de waarde van kolom State. De query retourneert vervolgens het aantal 'overlevende' rijen.
StormEvents
| where StartTime >= datetime(2007-11-01) and StartTime < datetime(2007-12-01)
| where State == "FLORIDA"
| count
In dit geval is het resultaat:
| Count |
|---|
| 23 |
Zie naslaginformatie over querytaal voor meer informatie.
Meest voorkomende operators
De operators die in deze sectie worden behandeld, zijn de bouwstenen voor het begrijpen van query's in Azure Data Explorer. De meeste query's die u schrijft, bevatten verschillende van deze operators.
Query's uitvoeren op het Help-cluster: selecteer Klik om een query uit te voeren boven elke query.
Query's uitvoeren op uw eigen cluster:
Kopieer elke query naar de webquerytoepassing en selecteer vervolgens de query of plaats de cursor in de query.
Selecteer boven aan de toepassing de optie Uitvoeren.
count
count:retourneert het aantal rijen in de tabel.
De volgende query retourneert het aantal rijen in de tabel StormEvents.
StormEvents | count
take
take:retourneert tot het opgegeven aantal rijen met gegevens.
De volgende query retourneert vijf rijen uit de tabel StormEvents. De sleutelwoordlimiet is een alias voor take.
StormEvents | take 5
Tip
Er is geen garantie welke records worden geretourneerd, tenzij de brongegevens worden gesorteerd.
project
project:selecteert een subset van kolommen.
De volgende query retourneert een specifieke set kolommen.
StormEvents
| take 5
| project StartTime, EndTime, State, EventType, DamageProperty, EpisodeNarrative
waar
where:filtert een tabel naar de subset van rijen die voldoen aan een predicaat.
Met de volgende query worden de gegevens gefilterd op EventType en State .
StormEvents
| where EventType == 'Flood' and State == 'WASHINGTON'
| take 5
| project StartTime, EndTime, State, EventType, DamageProperty, EpisodeNarrative
sorteren
sort:Sorteer de rijen van de invoertabel op volgorde op een of meer kolommen.
Met de volgende query worden de gegevens in aflopende volgorde gesorteerd op DamageProperty .
StormEvents
| where EventType == 'Flood' and State == 'WASHINGTON'
| sort by DamageProperty desc
| take 5
| project StartTime, EndTime, State, EventType, DamageProperty, EpisodeNarrative
Notitie
De volgorde van de bewerkingen is belangrijk. Probeer take 5 vóór te sort by zetten. Krijgt u verschillende resultaten?
top
top:retourneert de eerste N records gesorteerd op de opgegeven kolommen.
De volgende query retourneert dezelfde resultaten als hierboven met één operator minder.
StormEvents
| where EventType == 'Flood' and State == 'WASHINGTON'
| top 5 by DamageProperty desc
| project StartTime, EndTime, State, EventType, DamageProperty, EpisodeNarrative
uitbreiden
extend:Berekent afgeleide kolommen.
Met de volgende query wordt een nieuwe kolom gemaakt door een waarde in elke rij te berekenen.
StormEvents
| where EventType == 'Flood' and State == 'WASHINGTON'
| top 5 by DamageProperty desc
| extend Duration = EndTime - StartTime
| project StartTime, EndTime, Duration, State, EventType, DamageProperty, EpisodeNarrative
Expressies kunnen alle gebruikelijke operators (+, -, *, /, %) bevatten en er is een reeks nuttige functies die u kunt aanroepen.
Samenvatten
summarize:aggregeert groepen rijen.
De volgende query retourneert het aantal gebeurtenissen door State .
StormEvents
| summarize event_count = count() by State
De samenvattende operator groepeert rijen met dezelfde waarden in de by-component en gebruikt vervolgens de aggregatiefunctie (zoals aantal )om elke groep in één rij te combineren. In dit geval is er dus een rij voor elke status en een kolom voor het aantal rijen in die status.
Er is een scala aan aggregatiefuncties en u kunt een aantal van deze functies in één samenvatten-operator gebruiken om verschillende berekende kolommen te produceren. U kunt bijvoorbeeld het aantal stormen in elke staat en het unieke aantal stormen per staat krijgen en vervolgens Top gebruiken om de staten met het meeste storm te krijgen.
StormEvents
| summarize StormCount = count(), TypeOfStorms = dcount(EventType) by State
| top 5 by StormCount desc
Het resultaat van een samenvattende bewerking heeft:
Elke kolom met de naam in door
Een kolom voor elke berekende expressie
Een rij voor elke combinatie van op-waarden
Render
render:geeft resultaten weer als grafische uitvoer.
Met de volgende query wordt een kolomdiagram weergegeven.
StormEvents
| summarize event_count=count(), mid = avg(BeginLat) by State
| sort by mid
| where event_count > 1800
| project State, event_count
| render columnchart
Met de volgende query wordt een eenvoudig tijddiagram weergegeven.
StormEvents
| summarize event_count=count() by bin(StartTime, 1d)
| render timechart
De volgende query telt gebeurtenissen op de tijd modulo één dag, binned in uren en geeft een tijddiagram weer.
StormEvents
| extend hour = floor(StartTime % 1d , 1h)
| summarize event_count=count() by hour
| sort by hour asc
| render timechart
Met de volgende query worden meerdere dagelijkse reeksen in een tijddiagram vergeleken.
StormEvents
| extend hour= floor( StartTime % 1d , 1h)
| where State in ("GULF OF MEXICO","MAINE","VIRGINIA","WISCONSIN","NORTH DAKOTA","NEW JERSEY","OREGON")
| summarize event_count=count() by hour, State
| render timechart
Notitie
De operator render is een functie aan de clientzijde in plaats van onderdeel van de engine. Het is geïntegreerd in de taal voor gebruiksgemak. De webtoepassing ondersteunt de volgende opties: staafdiagram, kolomdiagram, cirkeldiagram, tijddiagram en lijndiagram.
Scalaire operators
In deze sectie worden enkele van de belangrijkste scalaire operators be behandelt.
bin()
bin(): rondt waarden af naar een geheel getal van een veelvoud van een bepaalde bingrootte.
Met de volgende query wordt het aantal berekend met een bucketgrootte van één dag.
StormEvents
| where StartTime > datetime(2007-02-14) and StartTime < datetime(2007-02-21)
| summarize event_count = count() by bin(StartTime, 1d)
case()
case(): evalueert een lijst met predicaten en retourneert de expressie voor het eerste resultaat waarvan het predicaat is voldaan, of de laatste else-expressie. U kunt deze operator gebruiken om gegevens te categoriseren of te groeperen:
De volgende query retourneert een nieuwe kolom deaths_bucket en groepeert de sterfgevallen op nummer.
StormEvents
| summarize deaths = sum(DeathsDirect) by State
| extend deaths_bucket = case (
deaths > 50, "large",
deaths > 10, "medium",
deaths > 0, "small",
"N/A")
| sort by State asc
extract()
extract(): haalt een overeenkomst op voor een reguliere expressie uit een tekstreeks.
Met de volgende query worden specifieke kenmerkwaarden uit een trace geëxtraheerd.
let MyData = datatable (Trace: string) ["A=1, B=2, Duration=123.45,...", "A=1, B=5, Duration=55.256, ..."];
MyData
| extend Duration = extract("Duration=([0-9.]+)", 1, Trace, typeof(real)) * time(1s)
Deze query maakt gebruik van een let-instructie, die een naam (in dit geval ) verbindt met een expressie. Voor de rest van het bereik, waarin de let-instructie wordt weergegeven (globaal bereik of in een bereik van de functie-body), kan de naam worden gebruikt om te verwijzen naar de gebonden waarde.
parse_json()
parse_json(): Interpreteert een tekenreeks als een JSON-waarde en retourneert de waarde als dynamisch. Het is beter dan het gebruik van de functie extractjson() wanneer u meer dan één element van een samengesteld JSON-object moet extraheren.
Met de volgende query worden de JSON-elementen uit een matrix geëxtraheert.
let MyData = datatable (Trace: string)
['{"duration":[{"value":118.0,"valcount":5.0,"min":100.0,"max":150.0,"stdDev":0.0}]}'];
MyData
| extend NewCol = parse_json(Trace)
| project NewCol.duration[0].value, NewCol.duration[0].valcount, NewCol.duration[0].min, NewCol.duration[0].max, NewCol.duration[0].stdDev
Met de volgende query worden de JSON-elementen geëxtraheert.
let MyData = datatable (Trace: string) ['{"value":118.0,"valcount":5.0,"min":100.0,"max":150.0,"stdDev":0.0}'];
MyData
| extend NewCol = parse_json(Trace)
| project NewCol.value, NewCol.valcount, NewCol.min, NewCol.max, NewCol.stdDev
Met de volgende query worden de JSON-elementen met een dynamisch gegevenstype geëxtraheert.
let MyData = datatable (Trace: dynamic)
[dynamic({"value":118.0,"counter":5.0,"min":100.0,"max":150.0,"stdDev":0.0})];
MyData
| project Trace.value, Trace.counter, Trace.min, Trace.max, Trace.stdDev
ago()
ago(): trekt de opgegeven periode af van de huidige UTC-kloktijd.
De volgende query retourneert gegevens voor de afgelopen 12 uur.
//The first two lines generate sample data, and the last line uses
//the ago() operator to get records for last 12 hours.
print TimeStamp= range(now(-5d), now(), 1h), SomeCounter = range(1,121)
| mv-expand TimeStamp, SomeCounter
| where TimeStamp > ago(12h)
startofweek()
startofweek(): Retourneert het begin van de week met de datum, verschoven door een offset, indien opgegeven
De volgende query retourneert het begin van de week met verschillende offsets.
range offset from -1 to 1 step 1
| project weekStart = startofweek(now(), offset),offset
Deze query maakt gebruik van de bereikoperator, die een tabel met één kolom met waarden genereert. Zie ook: startofday(), startofweek(), startofyear()), startofmonth(), endofday(), endofweek(), endofmonth()en endofyear().
between()
between(): Komt overeen met de invoer binnen het inclusieve bereik.
Met de volgende query worden de gegevens gefilterd op een bepaald datumbereik.
StormEvents
| where StartTime between (datetime(2007-07-27) .. datetime(2007-07-30))
| count
Met de volgende query worden de gegevens gefilterd op een bepaald datumbereik, met een kleine variatie van drie dagen ( 3d ) vanaf de begindatum.
StormEvents
| where StartTime between (datetime(2007-07-27) .. 3d)
| count
Tabellaire operators
Kusto heeft veel tabellaire operators, waarvan sommige in andere secties van dit artikel worden behandeld. Hier richten we ons op parseren.
parse
parseren:evalueert een tekenreeksexpressie en parseert de waarde ervan in een of meer berekende kolommen. Er zijn drie manieren om te parseren: eenvoudig (de standaardinstelling), regex en versoepeld.
Met de volgende query wordt een traceer geparseerd en worden de relevante waarden geëxtraheerd met behulp van een standaardwaarde voor eenvoudig parseren. De expressie (ook wel StringConstant genoemd) is een reguliere tekenreekswaarde en de overeenkomst is strikt: uitgebreide kolommen moeten overeenkomen met de vereiste typen.
let MyTrace = datatable (EventTrace:string)
[
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=23, lockTime=02/17/2016 08:40:01Z, releaseTime=02/17/2016 08:40:01Z, previousLockTime=02/17/2016 08:39:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00Z, releaseTime=02/17/2016 08:40:00Z, previousLockTime=02/17/2016 08:39:00Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01Z, releaseTime=02/17/2016 08:40:01Z, previousLockTime=02/17/2016 08:39:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01Z, releaseTime=02/17/2016 08:41:00Z, previousLockTime=02/17/2016 08:40:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00Z, releaseTime=02/17/2016 08:41:00Z, previousLockTime=02/17/2016 08:40:00Z)'
];
MyTrace
| parse EventTrace with * "resourceName=" resourceName ", totalSlices=" totalSlices:long * "sliceNumber=" sliceNumber:long * "lockTime=" lockTime ", releaseTime=" releaseTime:date "," * "previousLockTime=" previouLockTime:date ")" *
| project resourceName ,totalSlices , sliceNumber , lockTime , releaseTime , previouLockTime
Met de volgende query wordt een traceer geparseerd en worden de relevante waarden geëxtraheerd met behulp van kind = regex . StringConstant kan een reguliere expressie zijn.
let MyTrace = datatable (EventTrace:string)
[
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=23, lockTime=02/17/2016 08:40:01Z, releaseTime=02/17/2016 08:40:01Z, previousLockTime=02/17/2016 08:39:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00Z, releaseTime=02/17/2016 08:40:00Z, previousLockTime=02/17/2016 08:39:00Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01Z, releaseTime=02/17/2016 08:40:01Z, previousLockTime=02/17/2016 08:39:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01Z, releaseTime=02/17/2016 08:41:00Z, previousLockTime=02/17/2016 08:40:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00Z, releaseTime=02/17/2016 08:41:00Z, previousLockTime=02/17/2016 08:40:00Z)'
];
MyTrace
| parse kind = regex EventTrace with "(.*?)[a-zA-Z]*=" resourceName @", totalSlices=\s*\d+\s*.*?sliceNumber=" sliceNumber:long ".*?(previous)?lockTime=" lockTime ".*?releaseTime=" releaseTime ".*?previousLockTime=" previousLockTime:date "\\)"
| project resourceName , sliceNumber , lockTime , releaseTime , previousLockTime
Met de volgende query wordt een traceer geparseerd en worden de relevante waarden geëxtraheerd met behulp van kind = relaxed . StringConstant is een reguliere tekenreekswaarde en de overeenkomst wordt versoepeld: uitgebreide kolommen kunnen gedeeltelijk overeenkomen met de vereiste typen.
let MyTrace = datatable (EventTrace:string)
[
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=23, lockTime=02/17/2016 08:40:01Z, releaseTime=02/17/2016 08:40:01Z, previousLockTime=02/17/2016 08:39:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=15, lockTime=02/17/2016 08:40:00Z, releaseTime=02/17/2016 08:40:00Z, previousLockTime=02/17/2016 08:39:00Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=20, lockTime=02/17/2016 08:40:01Z, releaseTime=02/17/2016 08:40:01Z, previousLockTime=02/17/2016 08:39:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=22, lockTime=02/17/2016 08:41:01Z, releaseTime=02/17/2016 08:41:00Z, previousLockTime=02/17/2016 08:40:01Z)',
'Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=27, sliceNumber=16, lockTime=02/17/2016 08:41:00Z, releaseTime=02/17/2016 08:41:00Z, previousLockTime=02/17/2016 08:40:00Z)'
];
MyTrace
| parse kind=relaxed "Event: NotifySliceRelease (resourceName=PipelineScheduler, totalSlices=NULL, sliceNumber=23, lockTime=02/17/2016 08:40:01, releaseTime=NULL, previousLockTime=02/17/2016 08:39:01)" with * "resourceName=" resourceName ", totalSlices=" totalSlices:long * "sliceNumber=" sliceNumber:long * "lockTime=" lockTime ", releaseTime=" releaseTime:date "," * "previousLockTime=" previousLockTime:date ")" *
| project resourceName ,totalSlices , sliceNumber , lockTime , releaseTime , previousLockTime
Tijdreeksanalyse
make-series
make-series:aggregeert groepen rijen zoals samenvatten,maar genereert een (tijd)-reeksvector per elke combinatie van op-waarden.
De volgende query retourneert een reeks tijdreeksen voor het aantal stormgebeurtenissen per dag. De query beslaat een periode van drie maanden voor elke status, en vult ontbrekende bins in met de constante 0:
StormEvents
| make-series n=count() default=0 on StartTime in range(datetime(2007-01-01), datetime(2007-03-31), 1d) by State
Zodra u een reeks (tijd)reeksen hebt gemaakt, kunt u reeksfuncties toepassen om afwijkende vormen, seizoensgebonden patronen en nog veel meer te detecteren.
Met de volgende query worden de drie staten uit de top drie geëxtraheert met de meeste gebeurtenissen op een specifieke dag:
StormEvents
| make-series n=count() default=0 on StartTime in range(datetime(2007-01-01), datetime(2007-03-31), 1d) by State
| extend series_stats(n)
| top 3 by series_stats_n_max desc
| render timechart
Bekijk de volledige lijst met reeksfuncties voor meer informatie.
Geavanceerde aggregaties
We hebben eerder in dit artikel algemene aggregaties behandeld, zoals aantalensamenvatting. Deze sectie introduceert geavanceerdere opties.
top-nested
top-nested:produceert hiërarchische bovenste resultaten, waarbij elk niveau een inzoom is op basis van waarden op het vorige niveau.
Deze operator is handig voor scenario's met dashboardvisualisatie, of wanneer het nodig is om een vraag als de volgende te beantwoorden: "De top-N-waarden van K1 zoeken (met behulp van een aggregatie); zoek voor elk van deze de top-M-waarden van K2 (met behulp van een andere aggregatie); ..."
De volgende query retourneert een hiërarchische tabel State met op het hoogste niveau, gevolgd door Sources .
StormEvents
| top-nested 2 of State by sum(BeginLat),
top-nested 3 of Source by sum(BeginLat),
top-nested 1 of EndLocation by sum(BeginLat)
pivot() plugin
pivot()-invoeging:hiermee draait u een tabel door de unieke waarden van één kolom in de invoertabel om te zetten in meerdere kolommen in de uitvoertabel. De operator voert aggregaties uit waarbij ze vereist zijn voor eventuele resterende kolomwaarden in de uiteindelijke uitvoer.
Met de volgende query wordt een filter toegepast en worden de rijen in kolommen draait.
StormEvents
| project State, EventType
| where State startswith "AL"
| where EventType has "Wind"
| evaluate pivot(State)
dcount()
dcount(): retourneert een schatting van het aantal afzonderlijke waarden van een expressie in de groep. Gebruik count() om alle waarden te tellen.
De volgende query telt uniek Source in State .
StormEvents
| summarize Sources = dcount(Source) by State
dcountif()
dcountif(): retourneert een schatting van het aantal afzonderlijke waarden van de expressie voor rijen waarvoor het predicaat wordt geëvalueerd als waar.
De volgende query telt de afzonderlijke waarden van Source waar DamageProperty < 5000 .
StormEvents
| take 100
| summarize Sources = dcountif(Source, DamageProperty < 5000) by State
dcount_hll()
dcount_hll(): berekent de dcount van HyperLogLog-resultaten (gegenereerd door hllof hll_merge.
De volgende query maakt gebruik van het HLL-algoritme om het aantal te genereren.
StormEvents
| summarize hllRes = hll(DamageProperty) by bin(StartTime,10m)
| summarize hllMerged = hll_merge(hllRes)
| project dcount_hll(hllMerged)
arg_max()
arg_max(): Zoekt een rij in de groep die een expressie maximaliseert en retourneert de waarde van een andere expressie (of * om de hele rij te retourneren).
De volgende query retourneert de tijd van het laatste stroomrapport in elke staat.
StormEvents
| where EventType == "Flood"
| summarize arg_max(StartTime, *) by State
| project State, StartTime, EndTime, EventType
makeset()
makeset(): retourneert een dynamische matrix (JSON) van de set afzonderlijke waarden die een expressie in de groep op zich neemt.
De volgende query retourneert alle keren dat een overstroming door elke status is gerapporteerd en maakt een matrix op basis van de set afzonderlijke waarden.
StormEvents
| where EventType == "Flood"
| summarize FloodReports = makeset(StartTime) by State
| project State, FloodReports
mv-expand
mv-expand:breidt verzamelingen met meerdere waarden uit uit een kolom met dynamisch getypt, zodat elke waarde in de verzameling een afzonderlijke rij krijgt. Alle andere kolommen in een uit uitgebreide rij worden gedupliceerd. Dit is het tegenovergestelde van makelist.
Met de volgende query worden voorbeeldgegevens gegenereerd door een set te maken en deze vervolgens te gebruiken om de mogelijkheden van mv-expand te demonstreren.
let FloodDataSet = StormEvents
| where EventType == "Flood"
| summarize FloodReports = makeset(StartTime) by State
| project State, FloodReports;
FloodDataSet
| mv-expand FloodReports
percentiles()
percentiles(): Retourneert een schatting voor het opgegeven dichtstbijzijnde rangschikkings percentiel van de populatie die is gedefinieerd door een expressie. De nauwkeurigheid is afhankelijk van de dichtheid van de populatie in de regio van het percentiel. Kan alleen worden gebruikt in de context van aggregatie binnen summarize.
De volgende query berekent percentielen voor stormduur.
StormEvents
| extend duration = EndTime - StartTime
| where duration > 0s
| where duration < 3h
| summarize percentiles(duration, 5, 20, 50, 80, 95)
Met de volgende query worden percentielen voor stormduur berekend op status en worden de gegevens genormaliseerd met bins van vijf minuten ( 5m ).
StormEvents
| extend duration = EndTime - StartTime
| where duration > 0s
| where duration < 3h
| summarize event_count = count() by bin(duration, 5m), State
| summarize percentiles(duration, 5, 20, 50, 80, 95) by State
Gegevenssets kruisen
Deze sectie bevat elementen waarmee u complexere query's kunt maken, gegevens kunt toevoegen aan tabellen en query's kunt uitvoeren op databases en clusters.
Laat
let:verbetert de modulariteit en hergebruik. Met de instructie let kunt u een mogelijk complexe expressie opdelen in meerdere delen, die elk zijn gebonden aan een naam, en deze onderdelen samenbrengen. Een let-instructie kan ook worden gebruikt om door de gebruiker gedefinieerde functies en weergaven te maken (expressies voor tabellen waarvan de resultaten eruit zien als een nieuwe tabel). Expressies die zijn gebonden aan een let-instructie, kunnen van scalaire typen, van tabelvorm of door de gebruiker gedefinieerde functie (lambda's) zijn.
In het volgende voorbeeld wordt een tabellaire typevariabele gemaakt en gebruikt in een volgende expressie.
let LightningStorms =
StormEvents
| where EventType == "Lightning";
let AvalancheStorms =
StormEvents
| where EventType == "Avalanche";
LightningStorms
| join (AvalancheStorms) on State
| distinct State
join
join:voeg de rijen van twee tabellen samen om een nieuwe tabel te vormen door waarden van de opgegeven kolom(en) uit elke tabel te matchen. Kusto ondersteunt een volledig scala aan jointypen: fullouter,inner , innerunique, leftanti, leftantisemi, leftouter, leftsemi, rightanti, rightantisemi, rightouter, rightsemi.
In het volgende voorbeeld worden twee tabellen met een inner join.
let X = datatable(Key:string, Value1:long)
[
'a',1,
'b',2,
'b',3,
'c',4
];
let Y = datatable(Key:string, Value2:long)
[
'b',10,
'c',20,
'c',30,
'd',40
];
X
| join kind=inner Y on Key
Tip
Gebruik waar- en projectoperators om het aantal rijen en kolommen in de invoertabellen te verminderen vóór de join. Als de ene tabel altijd kleiner is dan de andere, gebruikt u deze als de linkerzijde (doorspijp) van de join. De kolommen voor de join-overeenkomst moeten dezelfde naam hebben. Gebruik indien nodig de projectoperator om de naam van een kolom in een van de tabellen te wijzigen.
Serialize
serialiseren:serialiseert de rijenset zodat u functies kunt gebruiken waarvoor geseraliseerde gegevens zijn vereist, zoals row_number().
De volgende query slaagt omdat de gegevens zijn geser serialiseerd.
StormEvents
| summarize count() by State
| serialize
| extend row_number = row_number()
De rijenset wordt ook beschouwd als geseraliseerd als het resultaat is van:operators voor sorteren, topof bereik, eventueel gevolgd door project, project-away,extend,waarbij , parseert,mv-expandof operators neemt.
StormEvents
| summarize count() by State
| sort by State asc
| extend row_number = row_number()
Query's op meerdere databases en meerdere clusters
Query's voor databases en clusters:u kunt een query uitvoeren op een database in hetzelfde cluster door deze te verwijzen als . U kunt een query uitvoeren op een database op een extern cluster door er naar te verwijzen als cluster("MyCluster").database("MyDatabase").MyTable .
De volgende query wordt aangeroepen vanuit één cluster en vraagt gegevens op uit MyCluster het cluster. Gebruik uw eigen clusternaam en databasenaam om deze query uit te voeren.
cluster("MyCluster").database("Wiki").PageViews
| where Views < 2000
| take 1000;
Gebruikersanalyses
Deze sectie bevat elementen en query's die laten zien hoe eenvoudig het is om een analyse uit te voeren van het gedrag van gebruikers in Kusto.
Invoegtoepassing activity_counts_metrics
activity_counts_metrics-invoeging:berekent nuttige metrische gegevens voor activiteiten (totaal aantal waarden, afzonderlijke tellingswaarden, uniek aantal nieuwe waarden en geaggregeerd uniek aantal). Metrische gegevens worden berekend voor elk tijdvenster, vervolgens worden ze vergeleken en samengevoegd met en met alle eerdere tijdvensters.
Met de volgende query wordt de acceptatie door gebruikers geanalyseerd door het aantal dagelijkse activiteiten te berekenen.
let start=datetime(2017-08-01);
let end=datetime(2017-08-04);
let window=1d;
let T = datatable(UserId:string, Timestamp:datetime)
[
'A', datetime(2017-08-01),
'D', datetime(2017-08-01),
'J', datetime(2017-08-01),
'B', datetime(2017-08-01),
'C', datetime(2017-08-02),
'T', datetime(2017-08-02),
'J', datetime(2017-08-02),
'H', datetime(2017-08-03),
'T', datetime(2017-08-03),
'T', datetime(2017-08-03),
'J', datetime(2017-08-03),
'B', datetime(2017-08-03),
'S', datetime(2017-08-03),
'S', datetime(2017-08-04),
];
T
| evaluate activity_counts_metrics(UserId, Timestamp, start, end,
window)
Invoegtoepassing activity_engagement
activity_engagement-invoeglijn:berekent de betrokkenheidsverhouding van activiteiten op basis van de id-kolom in een verschuivend tijdlijnvenster. activity_engagement kan worden gebruikt voor het berekenen van DAU, WAU en MAU (dagelijkse, wekelijkse en maandelijks actieve gebruikers).
De volgende query retourneert de verhouding tussen het totale aantal afzonderlijke gebruikers dat dagelijks een toepassing gebruikt, vergeleken met het totale aantal afzonderlijke gebruikers dat de toepassing wekelijks gebruikt, in een bewegend venster van zeven dagen.
// Generate random data of user activities
let _start = datetime(2017-01-01);
let _end = datetime(2017-01-31);
range _day from _start to _end step 1d
| extend d = tolong((_day - _start)/1d)
| extend r = rand()+1
| extend _users=range(tolong(d*50*r), tolong(d*50*r+100*r-1), 1)
| mv-expand id=_users to typeof(long) limit 1000000
// Calculate DAU/WAU ratio
| evaluate activity_engagement(['id'], _day, _start, _end, 1d, 7d)
| project _day, Dau_Wau=activity_ratio*100
| render timechart
Tip
Wanneer u DAU/MAU berekent, wijzigt u de eindgegevens en de periode van het bewegende venster (OuterActivityWindow).
Invoegtoepassing activity_metrics
activity_metrics-invoegstroom: berekent nuttige metrische gegevens voor activiteiten (afzonderlijke tellingswaarden, uniek aantal nieuwe waarden, retentiepercentage en verloopsnelheid) op basis van het huidige periodevenster versus het vorige periodevenster.
Met de volgende query worden het verloop en de retentiesnelheid voor een bepaalde gegevensset berekend.
// Generate random data of user activities
let _start = datetime(2017-01-02);
let _end = datetime(2017-05-31);
range _day from _start to _end step 1d
| extend d = tolong((_day - _start)/1d)
| extend r = rand()+1
| extend _users=range(tolong(d*50*r), tolong(d*50*r+200*r-1), 1)
| mv-expand id=_users to typeof(long) limit 1000000
| where _day > datetime(2017-01-02)
| project _day, id
// Calculate weekly retention rate
| evaluate activity_metrics(['id'], _day, _start, _end, 7d)
| project _day, retention_rate*100, churn_rate*100
| render timechart
Invoegtoepassing new_activity_metrics
new_activity_metrics-invoegzin: berekent nuttige metrische gegevens voor activiteiten (afzonderlijke tellingswaarden, uniek aantal nieuwe waarden, retentiepercentage en verloopsnelheid) voor het cohort van nieuwe gebruikers. Het concept van deze invoegvoeging is vergelijkbaar met activity_metrics-invoegvoeging, maar is gericht op nieuwe gebruikers.
De volgende query berekent een retentie- en verlooppercentage met een week-over-weekvenster voor het cohort van de nieuwe gebruikers (gebruikers die de eerste week zijn aangekomen).
// Generate random data of user activities
let _start = datetime(2017-05-01);
let _end = datetime(2017-05-31);
range Day from _start to _end step 1d
| extend d = tolong((Day - _start)/1d)
| extend r = rand()+1
| extend _users=range(tolong(d*50*r), tolong(d*50*r+200*r-1), 1)
| mv-expand id=_users to typeof(long) limit 1000000
// Take only the first week cohort (last parameter)
| evaluate new_activity_metrics(['id'], Day, _start, _end, 7d, _start)
| project from_Day, to_Day, retention_rate, churn_rate
Invoegtoepassing session_count
session_count invoeging:berekent het aantal sessies op basis van de kolom ID via een tijdlijn.
De volgende query retourneert het aantal sessies. Een sessie wordt als actief beschouwd als een gebruikers-id ten minste één keer wordt weergegeven in een tijdsbestek van 100 tijdvakken, terwijl het venster voor het terugkijken van de sessie 41 tijdvakken is.
let _data = range Timeline from 1 to 9999 step 1
| extend __key = 1
| join kind=inner (range Id from 1 to 50 step 1 | extend __key=1) on __key
| where Timeline % Id == 0
| project Timeline, Id;
// End of data definition
_data
| evaluate session_count(Id, Timeline, 1, 10000, 100, 41)
| render linechart
Invoegtoepassing funnel_sequence
funnel_sequence invoeging:berekent het unieke aantal gebruikers dat een reeks staten heeft genomen; toont de distributie van vorige en volgende staten die hebben geleid tot of zijn gevolgd door de reeks.
De volgende query laat zien welke gebeurtenis er vóór en na alle Tornado-gebeurtenissen in 2007 gebeurt.
// Looking on StormEvents statistics:
// Q1: What happens before Tornado event?
// Q2: What happens after Tornado event?
StormEvents
| evaluate funnel_sequence(EpisodeId, StartTime, datetime(2007-01-01), datetime(2008-01-01), 1d,365d, EventType, dynamic(['Tornado']))
Invoegtoepassing funnel_sequence_completion
funnel_sequence_completion invoeging:berekent de trechter van voltooide reeksstappen binnen verschillende perioden.
Met de volgende query wordt de voltooiings-trechter van de reeks gecontroleerd: in 'totale' tijden van één uur, vier uur Hail -> Tornado -> Thunderstorm -> Wind en één dag ( [1h, 4h, 1d] ).
let _start = datetime(2007-01-01);
let _end = datetime(2008-01-01);
let _windowSize = 365d;
let _sequence = dynamic(['Hail', 'Tornado', 'Thunderstorm', 'Wind']);
let _periods = dynamic([1h, 4h, 1d]);
StormEvents
| evaluate funnel_sequence_completion(EpisodeId, StartTime, _start, _end, _windowSize, EventType, _sequence, _periods)
Functions
Deze sectie bevat informatie over functies:herbruikbare query's die zijn opgeslagen op de server. Functies kunnen worden aangeroepen door query's en andere functies (recursieve functies worden niet ondersteund).
Notitie
U kunt geen functies maken in het Help-cluster. Dit is alleen-lezen. Gebruik uw eigen testcluster voor dit onderdeel.
In het volgende voorbeeld wordt een functie gemaakt die een statusnaam ( MyState ) als argument gebruikt.
.create function with (folder="Demo")
MyFunction (MyState: string)
{
StormEvents
| where State =~ MyState
}
In het volgende voorbeeld wordt een functie aanroept, die gegevens op haalt voor de staat Texas.
MyFunction ("Texas")
| summarize count()
In het volgende voorbeeld wordt de functie verwijderd die in de eerste stap is gemaakt.
.drop function MyFunction