Tworzenie tabel różnicowych

Ukończone

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.