Łączenie i optymalizowanie danych

Ukończone

Organizacje często sortują różne typy informacji z wielu źródeł. Informacje są przechowywane w dużej liczbie tabel. Czasami może być konieczne sprzężenie tabel na podstawie relacji logicznych między nimi w celu dokładniejszej analizy lub raportowania. W scenariuszu firmy detalicznej tabele są używane dla klientów, produktów i informacji o sprzedaży.

W tym module poznasz różne sposoby łączenia danych w zapytaniach Kusto, aby dać członkom zespołu informacje potrzebne do zwiększenia świadomości produktów i zwiększenia sprzedaży.

Poznaj swoje dane

Przed rozpoczęciem pisania zapytań łączących informacje z tabel należy zrozumieć dane. Podczas pracy z zapytaniami Kusto chcesz traktować tabele jako szeroko należące do jednej z dwóch kategorii:

  • Tabele faktów: tabele, których rekordy są niezmienialnymi faktami, takimi jak tabela SalesFact w scenariuszu firmy detalicznej. W tych tabelach rekordy są stopniowo dołączane w sposób przesyłania strumieniowego lub w dużych fragmentach. Rekordy pozostają w tabeli, dopóki nie zostaną usunięte i nigdy nie zostaną zaktualizowane.
  • Tabele wymiarów: tabele, których rekordy są wymiarami modyfikowalnymi, takimi jak tabele Customers i Products w scenariuszu firmy detalicznej. Te tabele przechowują dane referencyjne, takie jak tabele odnośników z identyfikatora jednostki do jego właściwości. Tabele wymiarów nie są regularnie aktualizowane przy użyciu nowych danych.

W naszym scenariuszu firmy zajmującej się sprzedażą detaliczną tabele wymiarów służą do wzbogacania tabeli SalesFact dodatkowymi informacjami lub udostępniasz więcej opcji filtrowania danych pod kątem zapytań.

Chcesz również poznać woluminy danych, z którymi pracujesz, oraz ich strukturę lub schemat (nazwy kolumn i typy). Aby uzyskać te informacje, możesz uruchomić następujące zapytania, zastępując TABLE_NAME nazwą sprawdzanej tabeli:

  • Aby uzyskać liczbę rekordów w tabeli, użyj count operatora :

    TABLE_NAME
    | count
    
  • Aby uzyskać schemat tabeli, użyj getschema operatora :

    TABLE_NAME
    | getschema
    

Uruchomienie tych zapytań dotyczących tabel faktów i wymiarów w scenariuszu firmy zajmującej się sprzedażą detaliczną zawiera informacje podobne do następujących:

Table Rekordy Schemat
SalesFact 2,832,193 — SalesAmount (rzeczywiste)
- TotalCost (rzeczywisty)
- DateKey (data/godzina)
- ProductKey (długi)
- CustomerKey (długi)
Odbiorcy 18,484 - CityName (ciąg)
- Nazwa_firmy (ciąg)
- ContinentName (ciąg)
- CustomerKey (długi)
- Edukacja (ciąg)
- FirstName (ciąg)
- Płeć (ciąg)
- LastName (ciąg)
- MaritalStatus (ciąg)
- Zawód (ciąg)
- RegionCountryName (ciąg)
- StateProvinceName (ciąg)
Produkty 2,517 - ProductName (ciąg)
— Producent (ciąg)
- ColorName (ciąg)
- ClassName (ciąg)
- ProductCategoryName (ciąg)
- ProductSubcategoryName (ciąg)
- ProductKey (długi)

W tabeli wyróżniono unikatowe identyfikatory CustomerKey i ProductKey , które są używane do łączenia rekordów między tabelami.

Omówienie zapytań obejmujących wiele tabel

Po przeanalizowaniu danych należy zrozumieć, jak połączyć tabele w celu dostarczenia potrzebnych informacji. Zapytania Kusto udostępniają kilka operatorów, których można użyć do łączenia danych z wielu tabel, w tym lookupoperatorów , joini union .

Operator join scala wiersze dwóch tabel, pasując do wartości określonych kolumn z każdej tabeli. Tabela wynikowa zależy od rodzaju używanego sprzężenia. Jeśli na przykład używasz sprzężenia wewnętrznego, tabela ma te same kolumny co lewa tabela (czasami nazywana tabelą zewnętrzną), a także kolumny z prawej tabeli (czasami nazywanej tabelą wewnętrzną). Więcej informacji o rodzajach sprzężenia znajduje się w następnej sekcji. Aby uzyskać najlepszą wydajność, jeśli jedna tabela jest zawsze mniejsza niż druga, użyj jej jako lewej join strony operatora.

Operator lookup jest specjalną implementacją join operatora, który optymalizuje wydajność zapytań, w których tabela faktów jest wzbogacona o dane z tabeli wymiarów. Rozszerza tabelę faktów o wartości, które są wyszukane w tabeli wymiarów. Aby uzyskać najlepszą wydajność, system domyślnie zakłada, że tabela po lewej stronie jest większa (fakt), a prawa tabela to mniejsza (wymiar). To założenie jest dokładnie przeciwieństwem założenia stosowanego join przez operatora.

Operator union zwraca wszystkie wiersze z co najmniej dwóch tabel. Jest to przydatne, gdy chcesz połączyć dane z wielu tabel.

Funkcja materialize() buforuje wyniki wykonywania zapytania w celu późniejszego ponownego użycia w zapytaniu. Jest to jak tworzenie migawki wyników podzapytania i wielokrotne używanie go w zapytaniu. Ta funkcja jest przydatna podczas optymalizowania zapytań w scenariuszach, w których wyniki:

  • Kosztowna do obliczeń
  • Są nieokreślone

Wkrótce dowiesz się więcej na temat różnych operatorów scalania tabel i materialize() funkcji oraz sposobu ich używania.

Rodzaje sprzężeń

Diagram showing query join kinds.

Istnieje wiele różnych rodzajów sprzężeń, które mogą mieć wpływ na schemat i wiersze w wynikowej tabeli. W poniższej tabeli przedstawiono rodzaje sprzężeń obsługiwanych przez zwracane język zapytań Kusto i schemat oraz wiersze:

Rodzaj sprzężenia opis Ilustracja
innerunique (domyślne) Sprzężenie wewnętrzne z deduplikacją po lewej stronie
Schemat: wszystkie kolumny z obu tabel, w tym pasujące klucze
Wiersze: wszystkie deduplikowane wiersze z lewej tabeli pasujące do wierszy z prawej tabeli
inner Standardowe sprzężenie wewnętrzne
Schemat: wszystkie kolumny z obu tabel, w tym pasujące klucze
Wiersze: tylko pasujące wiersze z obu tabel
leftouter Lewe sprzężenia zewnętrzne
Schemat: wszystkie kolumny z obu tabel, w tym pasujące klucze
Wiersze: wszystkie rekordy z lewej tabeli i tylko pasujące wiersze z prawej tabeli
rightouter Prawe sprzężenia zewnętrzne
Schemat: wszystkie kolumny z obu tabel, w tym pasujące klucze
Wiersze: wszystkie rekordy z prawej tabeli i tylko pasujące wiersze z lewej tabeli
fullouter Pełne sprzężenia zewnętrzne
Schemat: wszystkie kolumny z obu tabel, w tym pasujące klucze
Wiersze: wszystkie rekordy z obu tabel z niezgodnymi komórkami wypełnionymi wartością null
leftsemi Lewe sprzężenia półsprzężenia
Schemat: wszystkie kolumny z lewej tabeli
Wiersze: wszystkie rekordy z tabeli po lewej stronie pasujące do rekordów z prawej tabeli
leftanti, , antileftantisemi Lewy antysprzężenia i częściowo wariant
Schemat: wszystkie kolumny z lewej tabeli
Wiersze: wszystkie rekordy z lewej tabeli, które nie pasują do rekordów z prawej tabeli
rightsemi Prawe sprzężenia półsprzężenia
Schemat: wszystkie kolumny z prawej tabeli
Wiersze: wszystkie rekordy z prawej tabeli pasujące do rekordów z lewej tabeli
rightanti, rightantisemi Prawy antysprzężenia i pół-wariant
Schemat: wszystkie kolumny z prawej tabeli
Wiersze: wszystkie rekordy z prawej tabeli, które nie pasują do rekordów z lewej tabeli

Zwróć uwagę, że domyślnym typem sprzężenia jest innerunique, i nie trzeba go określać. Niemniej jednak najlepszym rozwiązaniem jest zawsze jawne określenie rodzaju sprzężenia w celu uzyskania jasności.

W miarę postępów arg_min() w tym module poznasz również funkcje agregacji i arg_max() , as operator jako alternatywę dla let instrukcji oraz startofmonth() funkcję pomagającą w grupowaniu danych według miesięcy.