Modelowanie częściowo ustrukturyzowanych danych
W tym artykule zaleca się wzorce przechowywania częściowo ustrukturyzowanych danych w zależności od sposobu korzystania z danych przez organizację. Usługa Azure Databricks udostępnia funkcje, natywne typy danych i składnię zapytań do pracy z częściowo ustrukturyzowanymi, zagnieżdżonym i złożonymi danymi.
Następujące zagadnienia mają wpływ na wzorzec, którego należy użyć:
- Czy pola lub typy w źródle danych często się zmieniają?
- Ile pól unikatowych jest zawartych w źródle danych?
- Czy musisz zoptymalizować obciążenia pod kątem operacji zapisu lub odczytu?
Usługa Databricks zaleca przechowywanie danych jako tabel delty dla zapytań podrzędnych.
Korzystanie z wariantu
W środowisku Databricks Runtime 15.3 lub nowszym można użyć VARIANT
typu do przechowywania częściowo ustrukturyzowanych danych JSON przy użyciu zoptymalizowanego kodowania, które przewyższa ciągi JSON dla operacji odczytu i zapisu.
Typ VARIANT
ma podobne aplikacje jak ciągi JSON. Niektóre obciążenia nadal korzystają z używania struktur, map i tablic, zwłaszcza w przypadku danych z dobrze znanymi schematami, które skorzystają z zoptymalizowanego układu danych i zbierania statystyk.
Aby uzyskać więcej informacji, zobacz następujące artykuły:
- Wykonywanie zapytań dotyczących danych wariantów
- W jaki sposób wariant różni się od ciągów JSON?
- Pozyskiwanie danych jako typu wariantu częściowo ustrukturyzowanego
Używanie ciągów JSON
Dane można przechowywać w jednej kolumnie ciągu przy użyciu standardowego formatowania JSON, a następnie wykonywać zapytania dotyczące pól w formacie JSON przy użyciu notacji :
.
Wiele systemów generuje rekordy jako rekordy JSON zakodowane w ciągu lub bajtach. Pozyskiwanie i przechowywanie tych rekordów jako ciągów ma bardzo niskie obciążenie związane z przetwarzaniem. Możesz również użyć to_json
funkcji , aby przekształcić dowolną strukturę danych w ciąg JSON.
Podczas wybierania przechowywania danych jako ciągów JSON należy wziąć pod uwagę następujące mocne i słabe strony:
- Wszystkie wartości są przechowywane jako ciągi bez informacji o typie.
- Kod JSON obsługuje wszystkie typy danych, które mogą być reprezentowane przy użyciu tekstu.
- Kod JSON obsługuje ciągi o dowolnej długości.
- Nie ma żadnych ograniczeń dotyczących liczby pól, które mogą być reprezentowane w jednej kolumnie danych JSON.
- Dane nie wymagają wstępnego przetwarzania przed zapisaniem w tabeli.
- Problemy z typem występujące w danych w obciążeniach podrzędnych można rozwiązać.
- Kod JSON zapewnia najgorszą wydajność odczytu, ponieważ należy przeanalizować cały ciąg dla każdego zapytania.
Ciągi JSON zapewniają dużą elastyczność i łatwe w implementacji rozwiązanie do pobierania nieprzetworzonych danych do tabeli typu lakehouse. Możesz użyć ciągów JSON dla wielu aplikacji, ale są one szczególnie przydatne, gdy najważniejszy wynik obciążenia przechowuje kompletną i dokładną reprezentację źródła danych na potrzeby przetwarzania podrzędnego. Niektóre przypadki użycia mogą obejmować:
- Pozyskiwanie danych przesyłanych strumieniowo z usługi kolejki, takiej jak Kafka.
- Rejestrowanie odpowiedzi interfejsu API REST zapytań.
- Przechowywanie nieprzetworzonych rekordów z nadrzędnego źródła danych, które nie jest kontrolowane przez zespół.
Zakładając, że logika pozyskiwania jest elastyczna, przechowywanie danych w postaci ciągu JSON powinno być odporne, nawet jeśli napotkasz nowe pola, zmiany struktury danych lub zmiany typu w źródle danych. Chociaż obciążenia podrzędne mogą zakończyć się niepowodzeniem z powodu tych zmian, tabela zawiera pełną historię danych źródłowych, co oznacza, że można rozwiązać problemy bez konieczności powrotu do źródła danych.
Korzystanie ze struktur
Dane częściowo ustrukturyzowane można przechowywać za pomocą struktur i włączać wszystkie natywne funkcje kolumn przy zachowaniu zagnieżdżonej struktury źródła danych.
Usługa Delta Lake traktuje dane przechowywane jako struktury takie same jak inne kolumny, co oznacza, że nie ma różnicy funkcjonalnej między strukturami i kolumnami. Pliki danych Parquet używane przez usługę Delta Lake tworzą kolumnę dla każdego pola w ramach struktury. Pola struktury można używać jako kolumn klastrowania lub kolumn partycjonowania, a także można zbierać statystyki dotyczące struktur w celu pomijania danych.
Struktury zwykle zapewniają najlepszą wydajność odczytu, ponieważ obsługują wszystkie optymalizacje pomijania danych i przechowują poszczególne pola jako kolumny. Wydajność może zacząć się pogarszać, gdy liczba kolumn osiągnie setki.
Każde pole w strukturze ma typ danych, który jest wymuszany podczas zapisu w taki sam sposób jak kolumny. W związku z tym struktury wymagają pełnego wstępnego przetwarzania danych. Może to być korzystne, gdy chcesz tylko zweryfikować dane zatwierdzone w tabeli, ale może prowadzić do porzuconych danych lub zadań zakończonych niepowodzeniem podczas przetwarzania nieprawidłowo sformułowanych rekordów z systemów nadrzędnych.
Struktury są mniej elastyczne niż strumienie JSON na potrzeby ewolucji schematu, niezależnie od tego, czy dotyczy to ewoluujących typów danych, czy dodawania nowych pól.
Korzystanie z map i tablic
Za pomocą kombinacji map i tablic można replikować częściowo ustrukturyzowane formaty danych natywnie w usłudze Delta Lake. Nie można zbierać statystyk dotyczących pól zdefiniowanych przy użyciu tych typów, ale zapewniają zrównoważoną wydajność zarówno w przypadku zestawów danych częściowo ustrukturyzowanych, jak i dla zestawów danych częściowo ustrukturyzowanych, które mają około 500 pól.
Zarówno klucz, jak i wartość map są wpisywane, więc dane są wstępnie przetwarzane, a schemat jest wymuszany podczas zapisu.
Aby przyspieszyć zapytania, usługa Databricks zaleca przechowywanie pól, które są często używane do filtrowania danych jako oddzielnych kolumn.
Czy muszę spłaszczać moje dane?
Jeśli przechowujesz dane przy użyciu formatu JSON lub map, rozważ przechowywanie pól często używanych do filtrowania zapytań jako kolumn. Zbieranie statystyk, partycjonowanie i klastrowanie nie są dostępne dla pól w ciągach JSON ani mapach. Nie trzeba tego robić w przypadku danych przechowywanych jako struktury.
Składnia do pracy z zagnieżdżonych danych
Zapoznaj się z następującymi zasobami, aby uzyskać informacje na temat pracy z zagnieżdżonych danych: