Pułapki pyspark – union, union all

Problem:

Migrujemy kod z SQL do pyspark. Nie chcemy używać pyspark sql ale rzeczywiście użyć kodu napisanego w Sparku. Czy są polecenia, które inaczej działają w Spark i SQL? Mają taką samą składnie a zupełnie inne działanie? W jaki sposób sprawić, żeby zachować tą oczekiwaną funkcjonalność po migracji? Jako przykład weźmy union, union all w SQL’u i Sparku.

Rozwiązanie:

Dla przypomnienia, union w SQL łączy zbiory i usuwa duplikaty. Union all tylko łączy zbiory, bez usuwania duplikatów. W Sparku union tylko łączy zbiory ale nie usuwa duplikatów. W Sparku union all to alias do funkcji union.
Jeżeli w SQL masz funkcję union i chcesz również w pysparku deduplikować zbiór danych wtedy zastosuj:
df1.union(df2).distinct()

Read More

Jak używać funkcji okienkowej w Spark?

Problem:

SQL jest prosty. Funkcje okienkowe są proste, intuicyjne i przychodzi bez komplikacji. Natomiast w Spark? Jak wytłumaczyć koledze w zespole w jaki sposób tworzyć funkcję okienkowe w Spark? Od czego zacząć? Jakie są problemy i wyzwania w tworzeniu funkcji okienkowych? Jakie są różnic w porównaniu z SQL? Co jest łatwiejsze w utrzymaniu?

Rozwiązanie:

Na szybko można odpowiedzieć w ten sposób, że funkcja okienkowa tworzona jest w oderwaniu od data setu ale aplikowania na jego podzbiorze. Na przykład definicja wygląda w ten sposób:

user_window = Window.partitionBy(„user_id”).orderBy(„event_time”)

Jak to rozumieć? Dla każdego użytkownika okienko będzie posortowane po even_time i najstarsze dane będą pojawiały się na jako pierwsze a najświeższe dane wylądują w tym zbiorze danych jako ostatnie.

Potem wystarczy już tylko użyć funkcji okienkowej.

Ale zacznijmy po kolei i na przykładzie.

Read More

Ładowanie danych z Databricks do Azure Synapse Analytics

Problem:

Zadanie zostało zdefiniowane przez managera w ten sposób:
– Dane z Databricks mają zostać przesłane na Azure Synapse
– Security utworzyło i otworzyło odpowiednie private endpointy.
– Dostałeś też namiary na service principala, którego wykorzystasz do zapisywania danych z Databricks na Azure Synapse.

Będziesz używał sparka, żeby od razu stworzył tabelę i dane. Będzie to szczególnie pomocne gdyż danych nie jest zbyt dużo. Nie powinno być żadnych problemów wydajnościowych.
Niestety pojawiają się problemy zupełnie innej natury. Przy próbie wstawienia danych dostajesz błąd:


„com.microsoft.sqlserver.jdbc.SQLServerException: The statement failed. Column 'drone_spec_key’ has a data type that cannot participate in a columnstore index.”

Rozwiązanie:

Spark wysyłał do Synapsa create i insert statement w tym samym czasie. Błąd wynikał z tego, że Synapse przy próbie stworzenia tabeli jednocześnie próbuje stworzyć custered index. Niestety ograniczenie, które posiada to brak możliwości stworzenia indeksu na kolumnach, gdzie typ danych zdefiniowany jest jako: VARCHAR(max), NVARCAHR(MAX) a to się dzieje, gdy spark próbuje stworzyć tabelę.
Jako rozwiązanie zastosowano:
1. Najpierw została tworzona tabela po stronie Azure Synapse Analytics
2. Dopiero później zostały wstawione do niej dane

Szczegóły kodu oraz alternatywne, dające więcej możliwości, rozwiązanie poniżej.

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: Jak pobrać definicję tabel i widoków?

Problem
Przeprowadzasz audyt istniejącego rozwiązania zbudowanego w oparciu o Databricks i Sparka.
Dla potrzeb budowy nowego modułu potrzebujesz sprawdzić, gdzie w widokach jest odwołanie do tabeli, którą będziesz zmieniał. Masz nieodparte wrażenie, że development został wykonany w sposób niechlujny i w notebookach nie ma wszystkiego. Część została zrobiona i potem zapomniana.
Potrzebujesz wydobyć definicję tabel i widoków zapisaną w hive metastore.

Rozwiązanie
Użyj polecenia

SHOW CREATE TABLE

Generuje ono skrypt SQL z definicją tabeli lub widoku.
Potrzeba trochę ulepszyć tą metodę. Ona zwraca definicję dla jednej tabeli i widoku. W naszej bazie jest tych tabel i widoków 100+.
Wykorzystamy SHOW VIEWS i SHOW TABLE i zautomatyzujemy sobie pracę. Na koniec zapiszemy wszystko do tabeli.

Read More

Databricks: IllegalStateException

Databricks: IllegalStateException

Problem:

Odpytując tabelę w Databricks dostajesz błąd

Error in SQL statement: IllegalStateException: Couldn’t find description#1350 in [id#1348,name#1349]
com.databricks.backend.common.rpc.SparkDriverExceptions$SQLExecutionException: java.lang.IllegalStateException: Couldn’t find description#1350 in [id#1348,name#1349]

Rozwiązanie:

Jedna z kolumn, które odpytujesz ma typ void. Dwie możliwości, naprawy:
1. Unikać w zapytaniu kolumn, które mają typ void i wybierać w zapytaniu tylko te kolumny, który mają zdefiniowany typ inny niż void.
2. Zdefiniować tabelę na nowo i zamiast typu void wstawić oczekiwany typ.

Pierwsza z propozycji jest tymczasowa i nie rozwiązuje problemu tylko umożliwia jego pominięcie. Druga propozycja rozwiązuje problem i to jest rekomendowane rozwiązanie.

Read More

Databricks job aborted

databricks job aborted

Problem

Ładujesz dane do Databricks. Skrypt uruchamiałeś już dziesiątki razy. Tym razem jednak dostałeś komunikat: „Job aborted”. To jest główny, podobno najbardziej znaczący komunikat błędu.

Próbujesz ponownego uruchomienia? Dzwonisz do wsparcia technicznego?

Jakie rozwiązania możesz zaproponować?

Propozycje rozwiązań

Co można zasugerować do puli rozwiązań?
– Klaster znalazł się w nieokreślonym stanie i wymaga restartu?
– Pliki Delta stały się nieczytelne, zostały zniszczone, uszkodzone lub nie ma do nich dostępu
– Zabrakło pamięci na przetwarzanie
– Zmiany w danych spowodowały, że job został anulowany

Read More

Zwinna hurtownia danych

zwinna hurtownia danych

Przenosząc rozwiązanie hurtowni danych do chmury, masz gotowy ból głowy.

Jak się odnaleźć w nowym środowisku? Jak dostarczyć tam dane? Jaką usługę wybrać? Jak przechowywać dane? Jak przetwarzać dane? Jak ustawić model dostępu do danych?

I jeszcze jedno wielkie pytanie:

Jak nie zbankrutować?

W niektórych przypadkach rozwiązaniem jest zwinna hurtownia danych.

Zwinna hurtownia danych to taka, która nie opiera się o bazę danych. Dane przechowuje w systemie plików, może to być na przykład Data Lake w chmurze (np. Azure Data Lake Gen 2 [nazewnictwo aktualne na kwiecień 2022]).

Zdecydowaną zaletą takiego rozwiązania jest niska cena.

Jak określić, czy taka hurtownia będzie dobra właśnie dla Ciebie?

Read More