建立目錄資料表
到目前為止,我們已考量過從資料框架建立的 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 文件中的資料表批次讀取和寫入 。