创建目录表

已完成

到目前为止,我们考虑了从数据帧创建的 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 方法将返回错误。 可以使用 createIfNotExistscreateOrReplace 方法缓解此行为。

使用目录表

可以使用目录表(如任何基于 SQL 的关系数据库中的表)查询和作它们,方法是使用标准 SQL 语句。 例如,下面的代码示例使用语句 SELECT 查询 ManagedSalesOrders 表:

%%sql

SELECT orderid, salestotal
FROM ManagedSalesOrders

小提示

有关使用 Delta Lake 的详细信息,请参阅 Delta Lake 文档中的 表批处理读取和写入