Tworzenie tabel różnicowych
Podczas tworzenia tabeli w usłudze Microsoft Fabric lakehouse tabela różnicowa jest definiowana w magazynie metadanych dla magazynu lakehouse, a dane dla tabeli są przechowywane w podstawowych plikach Parquet dla tabeli.
W przypadku większości interaktywnych narzędzi w środowisku usługi Microsoft Fabric szczegóły mapowania definicji tabeli w magazynie metadanych na pliki bazowe są abstrakcyjne. Jednak podczas pracy z platformą Apache Spark w usłudze Lakehouse masz większą kontrolę nad tworzeniem tabel różnicowych i zarządzaniem nimi.
Tworzenie tabeli różnicowej na podstawie ramki danych
Jednym z najprostszych sposobów utworzenia tabeli różnicowej na platformie Spark jest zapisanie ramki danych w formacie różnicowym. Na przykład poniższy kod PySpark ładuje ramkę danych z danymi z istniejącego pliku, a następnie zapisuje ramki danych jako tabelę różnicową:
# Load a file into a dataframe
df = spark.read.load('Files/mydata.csv', format='csv', header=True)
# Save the dataframe as a delta table
df.write.format("delta").saveAsTable("mytable")
Kod określa, że tabela powinna być zapisywana w formacie różnicowym z określoną nazwą tabeli. Dane tabeli są zapisywane w plikach Parquet (niezależnie od formatu pliku źródłowego załadowanego do ramki danych) w obszarze magazynu Tabele w lakehouse wraz z folderem _delta_log zawierającym dzienniki transakcji dla tabeli. Tabela znajduje się w folderze Tables for the lakehouse w okienku Eksplorator danych.
Tabele zarządzane a zewnętrzne
W poprzednim przykładzie ramka danych została zapisana jako zarządzana tabela. Oznacza to, że definicja tabeli w magazynie metadanych i pliki danych bazowych są zarządzane przez środowisko uruchomieniowe Spark dla usługi Fabric Lakehouse. Usunięcie tabeli spowoduje również usunięcie plików bazowych z lokalizacji przechowywania tabel dla magazynu lakehouse.
Tabele można również tworzyć jako tabele zewnętrzne , w których definicja tabeli relacyjnej w magazynie metadanych jest mapowana na alternatywną lokalizację przechowywania plików. Na przykład poniższy kod tworzy tabelę zewnętrzną, dla której dane są przechowywane w folderze w lokalizacji przechowywania plików dla usługi Lakehouse:
df.write.format("delta").saveAsTable("myexternaltable", path="Files/myexternaltable")
W tym przykładzie definicja tabeli jest tworzona w magazynie metadanych (więc tabela jest wyświetlana w interfejsie użytkownika Tabele dla usługi Lakehouse), ale pliki danych Parquet i pliki dziennika JSON dla tabeli są przechowywane w lokalizacji przechowywania plików (i będą wyświetlane w węźle Pliki w okienku Eksplorator usługi Lakehouse).
Możesz również określić w pełni kwalifikowaną ścieżkę dla lokalizacji magazynu, w następujący sposób:
df.write.format("delta").saveAsTable("myexternaltable", path="abfss://my_store_url..../myexternaltable")
Usunięcie tabeli zewnętrznej z magazynu metadanych lakehouse nie powoduje usunięcia skojarzonych plików danych.
Tworzenie metadanych tabeli
Chociaż często tworzy się tabelę na podstawie istniejących danych w ramce danych, często istnieją scenariusze, w których chcesz utworzyć definicję tabeli w magazynie metadanych, które zostaną wypełnione danymi na inne sposoby. Istnieje wiele sposobów osiągnięcia tego celu.
Korzystanie z interfejsu API deltaTableBuilder
Interfejs API deltaTableBuilder umożliwia pisanie kodu platformy Spark w celu utworzenia tabeli na podstawie specyfikacji. Na przykład poniższy kod tworzy tabelę o określonej nazwie i kolumnach.
from delta.tables import *
DeltaTable.create(spark) \
.tableName("products") \
.addColumn("Productid", "INT") \
.addColumn("ProductName", "STRING") \
.addColumn("Category", "STRING") \
.addColumn("Price", "FLOAT") \
.execute()
Korzystanie z usługi Spark SQL
Tabele różnicowe można również utworzyć przy użyciu instrukcji Spark SQL CREATE TABLE
, jak pokazano w tym przykładzie:
%%sql
CREATE TABLE salesorders
(
Orderid INT NOT NULL,
OrderDate TIMESTAMP NOT NULL,
CustomerName STRING,
SalesTotal FLOAT NOT NULL
)
USING DELTA
W poprzednim przykładzie jest tworzona zarządzana tabela. Możesz również utworzyć tabelę zewnętrzną LOCATION
, określając parametr, jak pokazano poniżej:
%%sql
CREATE TABLE MyExternalTable
USING DELTA
LOCATION 'Files/mydata'
Podczas tworzenia tabeli zewnętrznej schemat tabeli jest określany przez pliki Parquet zawierające dane w określonej lokalizacji. Takie podejście może być przydatne, gdy chcesz utworzyć definicję tabeli, która odwołuje się do danych, które zostały już zapisane w formacie różnicowym, lub na podstawie folderu, w którym oczekuje się pozyskiwania danych w formacie różnicowym.
Zapisywanie danych w formacie różnicowym
Do tej pory pokazano, jak zapisać ramkę danych jako tabelę różnicową (tworząc zarówno definicję schematu tabeli w magazynie metadanych, jak i pliki danych w formacie różnicowym) oraz jak utworzyć definicję tabeli (która tworzy schemat tabeli w magazynie metadanych bez zapisywania żadnych plików danych). Trzecią możliwością jest zapisanie danych w formacie różnicowym bez tworzenia definicji tabeli w magazynie metadanych. Takie podejście może być przydatne, gdy chcesz utrwalić wyniki przekształceń danych wykonywanych na platformie Spark w formacie pliku, za pomocą którego można później "nakładać" definicję tabeli lub proces bezpośrednio przy użyciu interfejsu API usługi delta lake.
Na przykład następujący kod PySpark zapisuje ramkę danych w nowej lokalizacji folderu w formacie różnicowym :
delta_path = "Files/mydatatable"
df.write.format("delta").save(delta_path)
Pliki różnicowe są zapisywane w formacie Parquet w określonej ścieżce i zawierają folder _delta_log zawierający pliki dziennika transakcji. Dzienniki transakcji rejestrują wszelkie zmiany w danych, takie jak aktualizacje wprowadzone w tabelach zewnętrznych lub za pośrednictwem interfejsu API usługi delta lake.
Zawartość istniejącego folderu można zastąpić danymi w ramce danych przy użyciu trybu zastępowania , jak pokazano poniżej:
new_df.write.format("delta").mode("overwrite").save(delta_path)
Możesz również dodać wiersze z ramki danych do istniejącego folderu przy użyciu trybu dołączania:
new_rows_df.write.format("delta").mode("append").save(delta_path)
Napiwek
Jeśli używasz techniki opisanej tutaj w celu zapisania ramki danych w lokalizacji Tabele w usłudze Lakehouse, usługa Microsoft Fabric używa funkcji automatycznego odnajdywania tabel w celu utworzenia odpowiednich metadanych tabeli w magazynie metadanych.