Gegevens combineren en optimaliseren

Voltooid

Organisaties sorteren vaak verschillende soorten informatie uit veel bronnen. De informatie wordt opgeslagen in een groot aantal tabellen. Soms moet u tabellen samenvoegen op basis van logische relaties tussen deze tabellen voor een diepere analyse of rapportage. In het scenario van het retailbedrijf gebruikt u tabellen voor klanten, producten en verkoopgegevens.

In deze module leert u over verschillende manieren om gegevens in Kusto-query's te combineren om uw teamleden de informatie te geven die ze nodig hebben om de productbewustzijn te vergroten en de verkoop te vergroten.

Inzicht krijgen in uw gegevens

Voordat u query's gaat schrijven die informatie uit uw tabellen combineren, moet u uw gegevens begrijpen. Wanneer u met Kusto-query's werkt, wilt u tabellen beschouwen als een van de volgende twee categorieën:

  • Feitentabellen: tabellen waarvan records onveranderbare feiten zijn, zoals de tabel SalesFact in het scenario van het retailbedrijf. In deze tabellen worden records geleidelijk aan streaming of in grote segmenten toegevoegd. De records blijven in de tabel staan totdat ze worden verwijderd en ze worden nooit bijgewerkt.
  • Dimensietabellen: tabellen waarvan de records veranderlijke dimensies zijn, zoals de tabellen Klanten en Producten in het scenario van het retailbedrijf. Deze tabellen bevatten referentiegegevens, zoals opzoektabellen van een entiteits-id naar de eigenschappen ervan. Dimensietabellen worden niet regelmatig bijgewerkt met nieuwe gegevens.

In het scenario van ons retailbedrijf gebruikt u dimensietabellen om de tabel SalesFact te verrijken met aanvullende informatie of om meer opties te bieden voor het filteren van de gegevens voor query's.

U wilt ook inzicht hebben in de volumes met gegevens waarmee u werkt en de bijbehorende structuur of het schema (kolomnamen en -typen). U kunt de volgende query's uitvoeren om die informatie op te halen door TABLE_NAME te vervangen door de naam van de tabel die u bekijkt:

  • Gebruik de count operator om het aantal records in een tabel op te halen:

    TABLE_NAME
    | count
    
  • Gebruik de getschema operator om het schema van een tabel op te halen:

    TABLE_NAME
    | getschema
    

Als u deze query's uitvoert op feiten- en dimensietabellen in het scenario van het retailbedrijf, krijgt u informatie zoals in het volgende voorbeeld:

Table Records Schema
SalesFact 2,832,193 - SalesAmount (echt)
- TotalCost (reëel)
- DateKey (datum/tijd)
- ProductKey (lang)
- CustomerKey (lang)
Klanten 18,484 - CityName (tekenreeks)
- CompanyName (tekenreeks)
- ContinentName (tekenreeks)
- CustomerKey (lang)
- Onderwijs (tekenreeks)
- Voornaam (tekenreeks)
- Geslacht (tekenreeks)
- Achternaam (tekenreeks)
- MaritalStatus (tekenreeks)
- Beroep (tekenreeks)
- RegionCountryName (tekenreeks)
- StateProvinceName (tekenreeks)
PRODUCTEN 2,517 - ProductName (tekenreeks)
- Fabrikant (tekenreeks)
- ColorName (tekenreeks)
- ClassName (tekenreeks)
- ProductCategoryName (tekenreeks)
- ProductSubcategoryName (tekenreeks)
- ProductKey (lang)

In de tabel hebben we de unieke id's CustomerKey en ProductKey gemarkeerd die worden gebruikt om records tussen tabellen te combineren.

Inzicht in query's met meerdere tabellen

Nadat u uw gegevens hebt geanalyseerd, moet u weten hoe u tabellen combineert om de informatie te verstrekken die u nodig hebt. Kusto-query's bieden verschillende operators die u kunt gebruiken om gegevens uit meerdere tabellen, waaronder de lookup, joinen union operators, te combineren.

De join operator voegt de rijen van twee tabellen samen door overeenkomende waarden van de opgegeven kolommen uit elke tabel te vergelijken. De resulterende tabel is afhankelijk van het type join dat u gebruikt. Als u bijvoorbeeld een inner join gebruikt, heeft de tabel dezelfde kolommen als de linkertabel (ook wel de buitenste tabel genoemd), plus de kolommen uit de rechtertabel (ook wel de binnenste tabel genoemd). In de volgende sectie vindt u meer informatie over jointypen. Als de ene tabel altijd kleiner is dan de andere tabel, gebruikt u deze als de linkerkant van de join operator.

De lookup operator is een speciale implementatie van een join operator die de prestaties van query's optimaliseert waarbij een feitentabel wordt verrijkt met gegevens uit een dimensietabel. Hiermee wordt de feitentabel uitgebreid met waarden die in een dimensietabel worden opgezoekd. Voor de beste prestaties gaat het systeem standaard ervan uit dat de linkertabel de grotere (feitentabel) is en dat de rechtertabel de kleinere (dimensietabel) is. Deze aanname is precies het tegenovergestelde van de veronderstelling die door de join operator wordt gebruikt.

De union operator retourneert alle rijen uit twee of meer tabellen. Het is handig als u gegevens uit meerdere tabellen wilt combineren.

Met materialize() de functie worden resultaten in de cache opgeslagen in een queryuitvoering voor later hergebruik in de query. Het is alsof u een momentopname maakt van de resultaten van een subquery en deze meerdere keren in de query gebruikt. Deze functie is handig bij het optimaliseren van query's voor scenario's waarin de resultaten worden weergegeven:

  • Zijn duur om te berekenen
  • Niet-deterministisch zijn

Kortom, u leert meer over de verschillende operatoren voor het samenvoegen van tabellen en de materialize() functie en hoe u deze kunt gebruiken.

Soorten join

Diagram showing query join kinds.

Er zijn veel verschillende soorten joins die kunnen worden uitgevoerd die van invloed zijn op het schema en de rijen in de resulterende tabel. De volgende tabel bevat de soorten joins die worden ondersteund door de Kusto-querytaal en schema en rijen die ze retourneren:

Soort samenvoegen Beschrijving Illustratie
innerunique (standaard) Inner join met ontdubbeling aan de linkerkant
Schema: Alle kolommen uit beide tabellen, inclusief de overeenkomende sleutels
Rijen: Alle ontdubbelde rijen uit de linkertabel die overeenkomen met rijen uit de rechtertabel
inner Standaard inner join
Schema: Alle kolommen uit beide tabellen, inclusief de overeenkomende sleutels
Rijen: Alleen overeenkomende rijen uit beide tabellen
leftouter Left outer join
Schema: Alle kolommen uit beide tabellen, inclusief de overeenkomende sleutels
Rijen: Alle records uit de linkertabel en alleen overeenkomende rijen uit de rechtertabel
rightouter Right outer join
Schema: Alle kolommen uit beide tabellen, inclusief de overeenkomende sleutels
Rijen: Alle records uit de rechtertabel en alleen overeenkomende rijen uit de linkertabel
fullouter Volledige outer join
Schema: Alle kolommen uit beide tabellen, inclusief de overeenkomende sleutels
Rijen: Alle records uit beide tabellen met niet-overeenkomende cellen gevuld met null
leftsemi Linker semi-join
Schema: Alle kolommen uit de linkertabel
Rijen: Alle records uit de linkertabel die overeenkomen met records uit de rechtertabel
leftanti, , antileftantisemi Linker anti-join en semi-variant
Schema: Alle kolommen uit de linkertabel
Rijen: Alle records uit de linkertabel die niet overeenkomen met records uit de rechtertabel
rightsemi Rechter semi-join
Schema: Alle kolommen uit de rechtertabel
Rijen: Alle records uit de rechtertabel die overeenkomen met records uit de linkertabel
rightanti, rightantisemi Rechter anti-join en semi variant
Schema: Alle kolommen uit de rechtertabel
Rijen: Alle records uit de rechtertabel die niet overeenkomen met records uit de linkertabel

U ziet dat het standaardtype join is inneruniqueen dat deze niet hoeft te worden opgegeven. Toch is het een best practice om altijd expliciet het soort join voor duidelijkheid op te geven.

Tijdens het doorlopen van deze module leert u ook meer over de arg_min() functies en arg_max() aggregatiefuncties, de as operator als alternatief voor de let instructie en de startofmonth() functie om u te helpen bij het groeperen van gegevens per maand.