建立和查詢目錄資料表

已完成

到目前為止,我們已考量過從資料框架建立的 Delta Lake 資料表執行個體,並透過 Delta Lake API 進行修改。 您也可以將 Delta Lake 資料表定義為中繼存放區內的目錄資料表,並使用 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 文件中的資料表批次讀取和寫入