建立差異資料表
在 Microsoft Fabric Lakehouse 中建立資料表時,會在 Lakehouse 的中繼存放區中定義差異資料表,並會將資料表的資料儲存在資料表的基礎 Parquet 檔案中。
在 Microsoft Fabric 環境中大多數的互動式工具會擷取將中繼存放區中的資料表定義對應至基礎檔案的詳細資料。 不過,在 Lakehouse 中使用 Apache Spark 時,即可更充分掌控差異資料表的建立和管理。
從資料框架建立差異資料表
在 Spark 中建立差異資料表最簡單的方式之一為以差異格式儲存資料框架。 例如,下列 PySpark 程式碼會載入具有現有檔案資料的資料框架,然後將該資料框架儲存為差異資料表:
# 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")
程式碼會指定資料表應該以具有指定資料表名稱的差異格式儲存。 資料表的資料會和包含資料表交易記錄的 _delta_log 資料夾一起儲存在 Lakehouse 中 [資料表]儲存體區域中的 Parquet 檔案中 (不論您載入至資料框架的來源檔案的格式為何)。 資料表會列在 [資料總管] 窗格之 Lakehouse 的 [資料表] 資料夾中。
[受控] 與 [外部] 資料表
在上述範例中,資料框架已儲存為 [受控] 資料表;這表示中繼存放區和基礎資料檔案中的資料表定義都是由 Fabric Lakehouse 的 Spark 執行階段管理。 刪除資料表時也會從 Lakehouse 的 [資料表] 儲存位置中刪除基礎檔案。
您也可以將資料表建立為 [外部] 資料表,其中中繼存放區中的關聯式資料表定義會對應至替代檔案儲存位置。 例如,下列程式碼會建立外部資料表,其中資料會儲存在 Lakehouse 的 [檔案] 儲存位置的資料夾中:
df.write.format("delta").saveAsTable("myexternaltable", path="Files/myexternaltable")
在此範例中,資料表定義會在中繼存放區中建立 (因此資料表會列在 Lakehouse 的 [資料表] 使用者介面中),但是資料表的 Parquet 資料檔案和 JSON 記錄檔則會儲存在 [檔案] 儲存位置 (而且會顯示在 [Lakehouse 總管] 窗格的 [檔案] 節點中)。
您也可以指定儲存位置的完整路徑,如下所示:
df.write.format("delta").saveAsTable("myexternaltable", path="abfss://my_store_url..../myexternaltable")
從 Lakehouse 中繼存放區刪除外部資料表時並不會刪除相關聯的資料檔案。
建立資料表中繼資料
雖然通常會從資料框架中的現有資料建立資料表,但經常會發生想要在中繼存放區中建立資料表定義的情況,此時會以其他方式填入資料。 有多種方式可以達成此目標。
使用 DeltaTableBuilder API
DeltaTableBuilder API 可讓您撰寫 Spark 程式碼,以根據您的規格建立資料表。 例如,下列程式碼會建立具有指定名稱和資料行的資料表。
from delta.tables import *
DeltaTable.create(spark) \
.tableName("products") \
.addColumn("Productid", "INT") \
.addColumn("ProductName", "STRING") \
.addColumn("Category", "STRING") \
.addColumn("Price", "FLOAT") \
.execute()
使用 Spark SQL
您也可以使用 Spark SQL CREATE TABLE
陳述式來建立差異資料表,如下列範例所示:
%%sql
CREATE TABLE salesorders
(
Orderid INT NOT NULL,
OrderDate TIMESTAMP NOT NULL,
CustomerName STRING,
SalesTotal FLOAT NOT NULL
)
USING DELTA
上述範例會建立 [受控] 資料表。 您也可以藉由指定 LOCATION
參數來建立外部資料表,如下所示:
%%sql
CREATE TABLE MyExternalTable
USING DELTA
LOCATION 'Files/mydata'
建立外部資料表時,資料表的結構描述會由包含指定位置資料的 Parquet 檔案決定。 當您想要建立的資料表定義參考已儲存為差異格式的資料或根據您預期要以差異格式內嵌資料的資料夾時,這個方法可能很實用。
以差異格式儲存資料
到目前為止,您已了解如何將資料框架儲存為差異資料表 (在中繼存放區中建立資料表結構描述定義,並以差異格式建立資料檔案),以及如何建立資料表定義 (會在中繼存放區中建立資料表結構描述,而不儲存任何資料檔案)。 第三種可能性為以差異格式儲存資料,而不需在中繼存放區中建立資料表定義。 當您想要以檔案格式保存在 Spark 中執行的資料轉換結果時,此方法即很實用,您稍後可以使用 Delta Lake API 來「重疊」資料表定義或直接進行處理。
例如,下列 PySpark 程式碼會將資料框架儲存到差異格式的新資料夾位置:
delta_path = "Files/mydatatable"
df.write.format("delta").save(delta_path)
差異檔案會以 Parquet 格式儲存在指定的路徑中,且會納入包含交易記錄檔的 _delta_log 資料夾。 交易記錄檔會記錄資料中的任何變更,例如對外部資料表或透過 Delta Lake API 所做的更新。
您可以使用覆寫模式,將現有資料夾的內容以資料取代,如下所示:
new_df.write.format("delta").mode("overwrite").save(delta_path)
您也可以使用附加模式,將資料列從資料框架新增至現有的資料夾:
new_rows_df.write.format("delta").mode("append").save(delta_path)
提示
如果您使用此處所述的技術,將資料框架儲存到 Lakehouse 中的 [資料表] 位置,Microsoft Fabric 會使用自動資料表探索功能,在中繼存放區中建立對應的資料表中繼資料。