Databricks: porównanie CTAS, deep i shallow clone

Problem:

Masz już wyczyszczone, połączone, załadowane i gotowe do konsumpcji przez warstwę raportową dane. Teraz Power BI będzie pobierało dane do dataflow. Następne ładowanie zaczyna się za chwilę i zmieni, kształt danych. Chcesz jednak załadowane dane wysłać do raportów. Żeby zapewnić spójny obraz danych potrzebujesz zrobić snapshot (migawkę) danych. Potrzebujesz zduplikować istniejące dane. Masz do wyboru: create table as select (CTAS), deep (głęboki) oraz shallow (płytki) klon danych.

Rozwiązanie:

W moim przypadku najlepszym rozwiązaniem będzie użycie głębokiego klonowania (deep clone). Płytkie klonowanie ma niestety ograniczenia, które wykluczają jego zastosowanie. CTAS jest zbyt wolny, to było dopiero odkrycie! Tabela, na której testowałem nie jest duża ma 0,5 GB ale to wystarczający wolumen żeby wyciągnąć wnioski.

Read More

Not able to load Function App

Problem:

Rozwijasz projekt w Function App. Dostałeś do napisania funkcję w C#. Funkcja została napisana, przetestowana i wdrożona na produkcję. Jak to w życiu, pojawiają się zmiany wymagań do funkcji, które też rozwijasz wdrażasz i zamiast oczekiwanych zmian widzisz błąd:
„We are not able to load some functions in the list due to errors”.
Gdy oglądasz szczegóły błędu widzisz:
„The operation timed out and could not be completed”.
W kodzie praktycznie nic się nie zmieniło a aplikacji nie da się uruchomić i używać.
Do zrobienia builda i deploymentu używałem Azure Devops.

Rozwiązanie:

Jeżeli szukasz szybkiego rozwiązania problemu to zaraz Ci go podam. W moim przypadku problemem nie był kod, który zmieniłem, bo zmiana była wręcz kosmetyczna: dodanie jednego loggera do obsługi błędów.
Deployment poprzedniej wersji także sprawiał, że aplikacja znowu zaczynała działać.
Co w takim razie było źle? W Dev Ops pipelines wystarczyło ustawić, żeby czyścił katalog deploymentu.
Niejasne? Już tłumaczę.

Read More

Databricks: Jak pobrać pliki binarne z Azure Storage Account używając Pythona?

Problem:

Masz dostępne Databricks, Pythona i Azure Storage Account. Potrzebujesz pobrać plik z Azure Storage account przy pomocy Pythona w formacie binarnym. Jeżeli chcesz zrobić to przy użyciu Sparka, albo Pandas to nie jest to zadanie.
Dane masz pobrać z pliku binarnego.
Trzeba użyć modułów Pythona do wczytywania plików.
W dokumentacji piszą, że taka operacja jest „not supported”. (Stan na 15.10.2024)
Nie chcesz też robić „mount” zdalnego systemu plików. Taka operacja jest nie polecana przez Databricks.

Rozwiązanie:

W Databricks z Pythona NIE można czytać plików ze zdalnego systemu plików. Można za to czytać pliki z lokalnego file systemu. Obejście problemu przedstawionego powyżej to:
1. Przy użyciu dbutils.fs albo %fs skopiować pliki ze zdalnego filesystemu do lokalnego.
2. Przeczytać pliki z lokalnego systemu plików przy użyciu Pythona.
Skasować skopiowany plik z lokalnego filesystemu.

Read More

Databricks Schema Evolution

Databricks schema evolution.

Problem: System źródłowy zmienia się dynamicznie, często pojawiają się nowe kolumny. Mamy dostosować się do zmian i nowe kolumny w źródle, mają pojawić się automatycznie w bronze layer.

Rozwiązanie: Użyj schema evolution, dzięki temu nowe kolumny będą w sposób automatyczny dodawane do Lake House. Włączymy tą funkcjonalność na poziomie clustra, żeby ułatwić obłsugę schema evolution w SQL’u.

Read More

Co to jest klucz zastępczy? (surrogate key)

klucz zastępczy

Klucz zastępczy (surrogate key) to identyfikator stworzony w hurtowni danych na potrzeby wymiaru albo faktu. Zastępuje klucz główny z systemu źródłowego.

Surrogate key posiada następujące właściwości:
– Jest unikalny w obrębie wymiaru, nie ma dwóch takich samych wartości w ramach jednego wymiaru
– Za tym kluczem nie stoi żadna logika biznesowa: to jest zwyczajny ciąg liczb lub znaków.
– Wykorzystujesz go, żeby łączyć wymiar z faktem albo łączyć wymiary ze sobą

Nigdy nie łączysz wymiaru z faktem wykorzystując klucz naturalny albo klucz z systemu źródłowego.

Klucz zastępczy możesz być typu INT, BIGINT, GUID. Zazwyczaj jest to wartość generowana przez motor bazy danych, Lakehouse albo narzędzie ETL.

Dzięki kluczowi zastępczemu nie bazujesz na wartościach z systemu źródłowego. Pozwala Ci to na swobodę zarządzania kluczami. Określania jakiego typu są wartości, jaki jest ich cykl życia, w jaki sposób są tworzone.

Read More

Co może pójść źle w testowaniu hurtowni danych?

testowanie hurtowni danych

Co może pójść źle w testowaniu hurtowni danych? Przecież to jest proste!

Dostajesz dane na wejściu. Przetwarzasz je. Dostajesz dane na wyjściu. Co może pójść źle?

Wyobrażasz sobie, że dane wejściowe dostajesz zawsze dobrej jakości? W wielu wypadkach tak jest. Niestety czasami jakość danych wejściowych pozostawia wiele do życzenia.

W tej kolumnie miały być tylko liczby, a dostajesz ciągi znaków.

Zamiast daty dostajesz wartość TRUE albo FALSE.

Albo jeszcze gorzej, miałeś dostawać zysk brutto a dostajesz dochód brutto. To już nie tak łatwo wychwycić.

Faktura miała mieć zawsze przypisane dane klienta, a czasami brakuje tych danych.

Wartość rezydualna miała być zawsze dodatnia, a jest ujemna.

Zdarza się, że z biegiem czasu logika w systemie źródłowym ewaluowała i próba pobrania historii to budowa zupełnie innego przetwarzania niż przetwarzanie bieżących danych.

Już sama analiza tego, co jest na wejściu to gotowy ból głowy.

A dane wejściowe to dopiero początek drogi.

Read More

Co to jest SCD?

co to jest cdc

Co to jest SCD? To akronim od angielskiego Slowly Changing Dimension czyli wolno zmieniający się wymiar. To nic innego, jak sposób na śledzenia zmian w danych w hurtowniach danych. W zależności od potrzeby stosuje się różne typy SCD.

Wyróżniamy sześć (6) typów SCD.

SCD 0 – ignorujesz zmiany

SCD 1 – nadpisujesz zmiany

SCD 2 – przechowujesz historię dla atrybutów w oddzielnym rekordzie.

SCD 3 – przechowujesz historię dla atrybutów w tym samym rekordzie ale innej kolumnie

SCD 4 – przechowujesz historię zmian w innej tabeli

SCD 6 – to kombinacja 1 + 2 + 3 = 6. Historia przechowywana jest zarówno w osobnej kolumnie jak i rekordzie.

U niektórych autorów znajdziesz również SCD 5 oraz SCD 7.

Najpopularniejsze są typy SCD 1, 2. Na rozmowie o prace, możesz dostać pytanie o SCD3. Tym trzem typom poświęcimy dzisiaj uwagę.

Read More

Co to jest ELT?

co to jest ETL

Co to jest ETL? To przeniesienie danych z jednego miejsca do drugiego i nadanie im oczekiwanej struktury. O ETL’u mówimy w kontekście przetwarzania zbiorów danych i budowaniu hurtowni danych lub data lake.

ETL służy do integracji i transformacji danych.

Wysoko poziomowo:
Na wejściu masz dane.
Przekształcasz je.
Zapisujesz.

Wynikiem ETL’a są przekształcone dane.

Po co jest ETL? Na przykład, żeby pobrać dane z systemu transakcyjnego i zapisać w hurtowni danych i potem stworzyć na podstawie tych danych raport. Pobierasz dane o zamówienia i klientach. Tworzysz zestawienie sprzedaży klienta. Dane do raportu aktualizujesz codziennie

Dodając więcej kontekstu:
Wynikiem ETL są uporządkowane dane. Mogą tworzyć wymiar lub tabelę faktów. Połączenie wymiarów i faktów tworzy większą strukturę: hurtownia danych.

Read More

Co to jest CTE?

Problem: Jak napisać zapytanie SQL w przejrzysty sposób. Będzie ono czytelne dla innych. Dodatkowo, gdy wrócisz do niego po kilku miesiącach też będzie dla Ciebie zrozumiałe.
W przypadku zmiany wymagań da się łatwo dostosować do nowych potrzeb. Będzie łatwe w utrzymaniu i rozbudowie.

Rozwiązanie: użyj Common Table Expressions (CTE), żeby napisać czytelny kod.

Read More

Jak usunąć dane z tabeli bez DELETE?

Problem

Usuń dane z tabeli bez używania polecenia DELETE. Użytkownik nie chce widzieć danych starszych niż 30 dni.

Tło biznesowe

Do tabeli faktów masz już załadowane 2 lata danych. Biznes dochodzi do wniosku, że z nie sięga tak daleko w historię. Nie są im te dane potrzebne. Albo na potrzeby zgodności z audytem (audit complience) powinny zostać usunięte.

Tło techniczne

Użycie polecenia DELETE nie wchodzi w grę, ponieważ:
– Nie jest efektywne
– Niektóre silniki bigdata nie wspierają operacji DELETE. Do data laka możesz dołączać dane. Usuwanie trzeba zaimplementować w inny sposób.

To jak zaimplementować usuwanie bez użycia DELETE?

Read More