Globalna Grupa ABD
Globalna Grupa jest jak rynek, na którym możemy się wszyscy spotkać. To tutaj możemy podzielić się... View more
Projekt NBP w Fabric migracja do Databricks
-
Projekt NBP w Fabric migracja do Databricks
Cześć! Niedawno obroniłam pracę inżynierską „Projekt i implementacja systemu przetwarzania danych opartego o architekturę Lakehouse w Microsoft Fabric” i chcę podzielić się z wami projektem, który był jej największym elementem. Przy okazji dziękuję Markowi Czumie za solidną dawkę wiedzy o Sparku. Przydała się i od strony teorii i praktyki.
https://github.com/klaudia-q/nbp-lakehouse-fabric
W wielu projektach technologia zmienia się z różnych powodów. U mnie prozaicznie: wygaśnie dostęp do konta uczelnianego, a razem z nim do Fabrica. Uznałam to za dobrą okazję, żeby spróbować sił w migracji i przenieść projekt na Databricks, równolegle ucząc się z kursu Krzysztofa Nojmana.
Im dłużej patrzę na własny kod, tym wyraźniej widzę, że parę rzeczy działa u mnie wyłącznie dlatego, że przy każdym uruchomieniu nadpisuję wszystko overwrite. Jak wejdzie MERGE, to się posypie.
Najbardziej nie daje mi spokoju klucz surogatowy w wymiarze walut. Nadaję go row_number()em po kodzie waluty, od nowa przy każdym przebiegu. Teraz jest spójnie, bo fakty przeliczam w tym samym locie. Ale jak przejdę na przyrostowe i dojdzie nowa waluta gdzieś w środku alfabetu, numeracja się przesunie i fakty zapisane wcześniej zaczną wskazywać nie na to, co trzeba. Widzę trzy wyjścia i przy każdym mam wątpliwość. Mogę zrobić MERGE na wymiarze, żeby klucz dostawały tylko nowe kody, a stare zostawały nietknięte poprawnie, ale wprowadza stan, który trzeba pilnować. Mogę liczyć klucz deterministycznie, sha2(currency_code, 256) problem znika bez żadnego stanu, tylko dostaję nieczytelny string zamiast małego inta w tabeli faktów. Albo mogę w ogóle odpuścić surogat i zostawić sam currency_code: wymiar ma kilkadziesiąt wierszy, żadnej historii tam nie wersjonuję, a kod ISO jest stabilny.
Ciągnie mnie do trzeciego, bo najprostsze, ale mam z tyłu głowy, że gdybym kiedyś chciała SCD2, sama sobie zamykam drogę. Robicie tak u siebie przy małych wymiarach, czy to jednak grzech?
Druga rzecz, na której straciłam najwięcej czasu przy pisaniu: Bronze zapisywał przez .save(„Tables/…”), a Silver czytał przez nazwę tabeli. Pliki leżały gdzie trzeba, tylko Spark ich nie widział w katalogu. CREATE TABLE … LOCATION ze ścieżką względną nie pomogło, dopiero pełna abfss://. Zrzuty z całego grzebania wrzuciłam do repo, bo szkoda było wyrzucać. W Databricks pod Unity Catalog to pewnie w ogóle nie wystąpi, ale jestem ciekawa, czy ktoś świadomie trzyma zapis po ścieżce zamiast saveAsTable i ma ku temu powód, którego nie widzę.No i trzecia, bardziej modelowa. Łączę A z C full outer joinem, bo teoretycznie daty mogą się rozjechać. W praktyce na moich danych nie trafiłam na ani jeden wiersz bez pary, więc to jest inner udający coś więcej. Tu też mam dwie drogi: zostawić full outer i dorzucić coalesce() na nazwę waluty, albo zejść do innera i wywalać przypadki bez pary do logu jako anomalię. Druga wydaje mi się uczciwsza wobec danych, ale zakłada, że rozjazd między A i C to błąd, a nie dopuszczalny stan, czego szczerze mówiąc nie sprawdziłam w dokumentacji NBP.
Jak ktoś przechodził już drogę Fabric -> Databricks, to chętnie posłucham, co sprawiło wam problem?
-
This discussion was modified 3 dni temu by
Klaudia Kuszczak.
-
This discussion was modified 3 dni temu by
Zaloguj się aby odpowiedzieć
