创建目录表
到目前为止,我们考虑了从数据帧创建的 Delta Lake 表实例,并通过 Delta Lake API 进行了修改。 还可以将 Delta Lake 表定义为 Spark 池的 Hive 元存储中的目录表,并使用 SQL 来处理它们。
外部与托管表
Spark 目录中的表(包括 Delta Lake 表)可以是托管或外部表;了解这类表格之间的区别很重要。
- 在未指定位置的情况下定义 托管 表,数据文件存储在元存储使用的存储中。 删除表不仅会从目录中删除其元数据,而且还删除存储其数据文件的文件夹。
- 为自定义文件位置定义 外部 表,其中存储了表的数据。 表的元数据在 Spark 目录中定义。 删除表会从目录中删除元数据,但不会影响数据文件。
创建目录表
可通过多种方式创建目录表。
从数据帧创建目录表
可以使用 saveAsTable
作编写数据帧来创建托管表,如以下示例所示:
# Save a dataframe as a managed table
df.write.format("delta").saveAsTable("MyManagedTable")
## specify a path option to save as an external table
df.write.format("delta").option("path", "/mydata").saveAsTable("MyExternalTable")
使用 SQL 创建目录表
还可以通过将 CREATE TABLE
SQL 语句与 USING DELTA
子句和外部表的可选 LOCATION
参数结合使用来创建目录表。 可以使用 SparkSQL API 运行语句,如以下示例所示:
spark.sql("CREATE TABLE MyExternalTable USING DELTA LOCATION '/mydata'")
或者,可以在 Spark 中使用本机 SQL 支持来运行该语句:
%%sql
CREATE TABLE MyExternalTable
USING DELTA
LOCATION '/mydata'
小提示
如果目录中已存在具有指定名称的表,则 CREATE TABLE
语句将返回错误。 若要缓解此行为,可以使用 CREATE TABLE IF NOT EXISTS
语句或 CREATE OR REPLACE TABLE
语句。
定义表架构
到目前为止,在所有示例中,该表都是在没有显式架构的情况下创建的。 对于通过写入数据帧创建的表,表架构将从数据帧继承。 创建外部表时,架构继承自表位置中当前存储的任何文件。 但是,创建新的托管表或具有当前空位置的外部表时,可以通过将列名、类型和可为 null 性指定为 CREATE TABLE 语句的一部分来定义表架构;如以下示例所示:
%%sql
CREATE TABLE ManagedSalesOrders
(
Orderid INT NOT NULL,
OrderDate TIMESTAMP NOT NULL,
CustomerName STRING,
SalesTotal FLOAT NOT NULL
)
USING DELTA
使用 Delta Lake 时,将强制实施表架构 - 所有插入和更新都必须符合指定的列可为 null 性和数据类型。
使用 DeltaTableBuilder API
可以使用 DeltaTableBuilder API(Delta Lake API 的一部分)创建目录表,如以下示例所示:
from delta.tables import *
DeltaTable.create(spark) \
.tableName("default.ManagedProducts") \
.addColumn("Productid", "INT") \
.addColumn("ProductName", "STRING") \
.addColumn("Category", "STRING") \
.addColumn("Price", "FLOAT") \
.execute()
与 CREATE TABLE
SQL 语句类似,如果已存在具有指定名称的表,create
方法将返回错误。 可以使用 createIfNotExists
或 createOrReplace
方法缓解此行为。
使用目录表
可以使用目录表(如任何基于 SQL 的关系数据库中的表)查询和作它们,方法是使用标准 SQL 语句。 例如,下面的代码示例使用语句 SELECT
查询 ManagedSalesOrders 表:
%%sql
SELECT orderid, salestotal
FROM ManagedSalesOrders
小提示
有关使用 Delta Lake 的详细信息,请参阅 Delta Lake 文档中的 表批处理读取和写入 。