创建 Delta 表

已完成

在 Microsoft Fabric 湖屋中创建表时,将在湖屋的元存储中定义 Delta 表,该表的数据存储在该表的基础 Parquet 文件中。

对于 Microsoft Fabric 环境中的大多数交互式工具,将抽象化元存储中的表定义映射到基础文件的详细信息。 但是,在湖屋中使用 Apache Spark 时,可以更好地控制 Delta 表的创建和管理。

从数据帧创建 Delta 表

在 Spark 中创建 Delta 表的最简单方法之一是以 Delta 格式保存数据帧。 例如,以下 PySpark 代码使用现有文件中的数据加载数据帧,然后将该数据帧保存为 Delta 表:

# 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 格式保存该表。 该表的数据保存在湖屋的“表”存储区域的 Parquet 文件中(不考虑加载到数据帧中的源文件的格式),同时保存的还有一个包含该表事务日志的 _delta_log 文件夹。 该表将在“数据资源管理器”窗格中湖屋的“表”文件夹中列出

托管表与外部表

在上一个示例中,数据帧保存为托管表;这意味着元存储和基础数据文件中的表定义都由 Fabric 湖屋的 Spark 运行时管理。 删除表还将从湖屋的“表”存储位置删除基础文件。

你也可以将表创建为外部表,其中元存储中的关系表定义映射到备用文件存储位置。 例如,以下代码创建一个外部表,其数据存储在湖屋的“文件”存储位置的文件夹中:

df.write.format("delta").saveAsTable("myexternaltable", path="Files/myexternaltable")

在此示例中,表定义是在元存储中创建的(因此,该表列于湖屋的“表”用户界面中),但该表的 Parquet 数据文件和 JSON 日志文件存储在“文件”存储位置(并将显示在“湖屋资源管理器”窗格的“文件”节点中)。

你也可以为存储位置指定完全限定的路径,如下所示:

df.write.format("delta").saveAsTable("myexternaltable", path="abfss://my_store_url..../myexternaltable")

从湖屋元存储中删除外部表不会删除关联的数据文件

创建表元数据

虽然从数据帧中的现有数据创建表很常见,但是经常会出现希望在元存储中创建表定义(以其他方式填充数据)的情况。 可以通过多种方式实现此目标。

使用 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 语句创建 Delta 表,如以下示例所示:

%%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 文件确定。 如果要创建引用已以 Delta 格式保存的数据的表定义,或者基于你希望引入 Delta 格式数据的文件夹创建表定义,此方法非常有用。

以 Delta 格式保存数据

到目前为止,你已了解如何将数据帧保存为 Delta 表(在元存储中创建表架构定义和 Delta 格式的数据文件)以及如何创建表定义(在元存储中创建表架构而不保存任何数据文件)。 第三种可能性是以 Delta 格式保存数据,而无需在元存储中创建表定义。 如果要以文件格式保留 Spark 中执行的数据转换的结果(稍后可以使用 Delta Lake API 直接在其上“覆盖”表定义或处理),此方法非常有用。

例如,以下 PySpark 代码以 Delta 格式将数据帧保存到新的文件夹位置:

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)

提示

如果使用此处所述的技术将数据帧保存到湖屋中的“表”位置,Microsoft Fabric 使用自动表发现功能在元存储中创建相应的表元数据。