创建 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 使用自动表发现功能在元存储中创建相应的表元数据。