Databricks: Jak nie przechowywać sekretów?

Problem: Robisz audyt konfiguracji Databricks klastra stworzonego w Twojej organizacji. Przechowywanie sekretu do Azure storage account znajdujesz w spark configu. Jest tam zapisana taka właśnie konfiguracja:

fs.azure.account.oauth2.client.secret.storageaccountname.dfs.core.windows.net xsda33jncsax-secretinplaintext
Sekret jest przechowywane w czystym tekście.

Rozwiązanie: Akurat w tym przypadku autentykacja wykonywana jest przy pomocy service principala. Wszystkie sekrety przechowywane są w Key Vault a w Databricks stworzony jest secret scope. W konfiguracji sparka na poziomie klastra wystarczy ustawić wystarczy więc zrobić tylko tak:

fs.azure.account.oauth2.client.secret.storageaccountname.dfs.core.windows.net secrets/secret-scope/sp-app-secret

I wszystko działa 🙂

Read More

Databricks: Jak ustawić własną wartość dla kolumny identity?

Tło wydarzeń:

Masz tabelę stworzoną w Databricks. Klucz główny ustawiony jest jako kolumna identity. Dzięki temu masz obsłużone wstawianie unikalnych wartości. Nie musisz też tego robić samodzielnie, co tworzy miejsce na pominięcie czegoś. Jednak pojawia się wyzwanie. Twoja „sekwencja” zaczynała wstawianie danych od jedności a teraz chciałbyś wstawić singletony (-1, -2).

Problem:
Chciałbyś wstawić singletony do tabeli, gdzie jedna z kolumn jest typu Identity. W jaki sposób wstawić do niej oczekiwane wartości?

Rozwiązanie:
Zdefiniuj kolumnę klucza głównego jako:

generated by default as identity

Ale uważaj, jest jeden przypadek, gdy tak zdefiniowana kolumna może sprawić problemy.

Read More

Streamlit: Jak edytować dane?

Problem:

Porównujesz dwa zbiory danych: przed i po migracji. Wkraczasz w fazę budowania zaufania i wiarygodności. Okazało się, że nie wszystkie dane są jednakowe. Niektóre wymagają dodatkowej analizy i poprawek, a niektóre wyglądają lepiej w zmigrowanym datasecie. Na tyle lepiej, że trzeba je przedstawić biznesowi i pokazać na przykładach, że po migracji wyniki są lepsze.
W jaki sposób opisać te dane?

Rozwiązanie:

Jednym z pomysłów na rozwiązanie może być Streamlit. Przy jego pomocy dodasz komentarze, które potem będą służyły jako:
1. Punkt do analizy i późniejszego ponownego sprawdzenia
2. Przedstawisz je biznesowi jako dowód na poprawę jakości danych.

Read More

Co to jest left anti join?

Problem:

Posiadasz rozwiązanie działające w Databricks.

Jak wybrać z tabeli z zamówieniami tylko rekordy, które nie mają przypisanych klientów albo klienci, z jakiegoś powodu nie istnieją. Rozwiązanie zbuduj w oparciu o SQL’a.

Rozwiązanie:

Rozwiązanie pierwsze:

select o.* from d_order o
left join d_customer c on (o.customer_tk = c.customer_tk)
where c.coustomer_tk is null

Albo

select o.* from d_order o
left anti join d_customer c on (o.customer_tk = c.customer_tk)

To są równoznaczne zapytania. Ich rezultatem jest ten sam zbiór danych, różnią się tylko składnią.

Warto zauważyć, że to drugie z użyciem słowa kluczowego anti jest bardziej zwięzłe. Natomiast, gdy ten kod SQL próbujesz migrować na inną platformę, wtedy może nie zadziałać.

Read More

Streamlit: Jak porównywać zmigrowane dane?

Problem

Migracja danych. Redesign. Duża zmiana w funkcjonalności.

Masz potrzebę porównania danych pomiędzy stanem obecnym a stanem po zmianie. Zmianę mogło wywołać jedno z powyższych zdarzeń ale cel pozostaje ten sam: porównać dane, udowodnić poprawność danych i zdobyć zaufanie biznesu.

W jaki sposób porównać dane, żeby mieć większą pewność, że stworzony produkt jest dobrej jakości? Chcesz też pokazać managerowi w jaki sposób może sam sprawdzić jakość danych, jeżeli oczywiście ma na to przestrzeń.

Rozwiązanie

Aplikacja napisana w streamlit w bajecznie łatwy sposób pozwala zwizualizować porównanie danych. Do tego wynik jest na tyle efektowny, że od razu zostaniesz pracownikiem miesiąca.

Jedna uwaga, tutaj skupiam się na porównaniu jednego unitu, jednostki, wiersza.

Co będzie potrzebne:
– Python 😉
– Streamlit
– Pandas
– Źródło danych

Read More

Jaki jest rzeczywisty rozmiar pliku w Databricks?

Problem:
Czy Optimize automatycznie usuwa stare pliki? Czy one są ciągle dostępne? Czy po uruchomieniu Optimize na tabeli, liczba wykorzystywanego miejsca na Storage Account będzie mniejsza czy większa?

Po wykonaniu polecenia Optimize, Databricks pokazuje, że tabela jest reprezentowana przez mniejszą liczbę plików, natomiast na Storage Account liczba plików wzrosła. Jak to rozumieć?

Databricks pokazuje rozmiar tabeli / pliku, który nie jest zgodny z tym co widać na Azure Storage account. Która wartość jest prawidłowa? Jak z poziomu Databricks sprawdzić rozmiar pliku?

Rozwiązanie:
Z poziomu Databricks uruchom polecenie:

dbutils.fs.ls(file_path)

Wtedy zobaczysz ile rzeczywiście pliki zajmują. Jeżeli chcesz usunąć niepotrzebne pliki użyj polecenia Vacuum. Tylko pamiętaj, że domyślnie Vacuum, pozostawia na file systemie pliki stworzone w ciągu ostatnich 7 dni.

Read More

Jaki jest rozmiar tabeli, schematu w Databricks?

Problem:
Jaki jest rozmiar tabeli w Databricks? Ile miejsca zajmuje mój schemat? Jak policzyć rozmiar? W jaki sposób sprawdzić ile przybyło danych od ostatniego ładowania? Ile miejsca zajmuje bronze, silver oraz gold layer? Jak to zadanie zautomatyzować? Czy można z tego wyciągnąć jeszcze jakieś wnioski?

Rozwiązanie:
W Databricks dostępne jest polecenie:

describe detail table_name

Umożliwia ono pokazanie rozmiaru w bajtach, wylistowanie ile plików zajmuje obecnie tabela. Pokazuje też kiedy zostało utworzona albo ostatnio załadowana.

Pokażę teraz w jaki sposób, wygląda skrypt, który dla schematu zbiera dane o wszystkich tabelach.

Read More

Databricks explode czyli: jak wygenerować dodatkowe wiersze?

Problem:

Wygenerować dodatkowe wiersze w tabeli na podstawie wartości liczbowej. Wartość liczbowa określa ile wierszy ma być wygenerowanych. Wartość liczbowa zawsze istnieje i przyjmuje wartości od 1 do 10. Dla 1 mają nie być generowane nowe wiersze. Dla 2 mają zostać wygenerowane dwa wiersze, dla trójki trzy wiersze itd.

Rozwiązanie:

Użycie funkcji explode. Przyjmuje ona jako argument tablicę albo mapę. W naszym przypadku stworzymy listę. Będzie ona miała wartości od 1 do n. Gdzie n będzie wartością liczbową z tabeli. Do wygenerowania listy wartości użyjemy funkcji sequence.
Pseudo kod do rozwiązania będzie wyglądał w ten sposób:

explode(sequence(1, quantity, 1))

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