Łączenie i optymalizowanie danych
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 lookup
operatorów , join
i 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ń
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 , , anti leftantisemi |
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.