在 Unity 目錄中建立資料表

本文介紹 Unity 目錄中受控外部數據表的概念,並說明如何在 Unity 目錄中建立數據表。

注意

當您建立數據表時,請務必參考受 Unity 目錄控管的目錄,或將預設目錄設定 為受 Unity 目錄控管的目錄 。 請參閱 管理預設目錄

目錄會出現在目錄 hive_metastore 總管中,但不被視為受 Unity 目錄控管。 其是由 Azure Databricks 工作區的 Hive 中繼存放區所管理。 列出的所有其他目錄都會受到 Unity 目錄的控管。

您可以使用 Unity 目錄數據表升級介面,將 Hive 中繼存放區中註冊的現有數據表升級至 Unity 目錄。 請參閱 將Hive數據表和檢視升級至 Unity 目錄

受控數據表

受控數據表是在 Unity 目錄中建立資料表的預設方式。 Unity 目錄會管理這些數據表的生命週期和檔案配置。 您不應該使用 Azure Databricks 以外的工具,直接操作這些數據表中的檔案。

受控數據表會根據架構和目錄的設定方式,儲存在 中繼存放區、目錄或架構層級的受控記憶體中。 請參閱 在 Unity 目錄中指定受控儲存位置。

受控數據表一律使用 Delta 數據表格式。

卸除受控數據表時,其基礎數據會在 30 天內從您的雲端租用戶中刪除。

外部數據表

外部數據表是數據表,其數據會儲存在針對中繼存放區、目錄或架構指定的受控儲存位置之外。 只有在您需要直接存取 Azure Databricks 叢集或 Databricks SQL 倉儲外部的數據時,才使用外部數據表。

當您在外部數據表上執行 DROP TABLE 時,Unity 目錄不會刪除基礎數據。 若要卸除數據表,您必須是其擁有者。 您可以管理外部數據表的許可權,並以與受控數據表相同的方式在查詢中使用它們。 若要使用 SQL 建立外部資料表,請在 語句中CREATE TABLE指定LOCATION路徑。 外部資料表可以使用下列檔案格式:

  • DELTA
  • CSV
  • JSON
  • AVRO
  • PARQUET
  • ORC
  • TEXT

若要管理外部數據表基礎雲端記憶體的存取權,您必須設定 記憶體認證和外部位置

若要深入瞭解,請參閱 建立外部數據表

需求

您必須擁有 CREATE TABLE 您要在其中建立數據表的架構許可權,以及 USE SCHEMA 架構的許可權,以及 USE CATALOG 父目錄的許可權。

如果您要建立外部數據表,請參閱 建立外部數據表 以取得其他需求。

建立受控數據表

若要建立受控數據表,請執行下列 SQL 命令。 括弧中的項目是選擇性專案。 取代佔位元值:

  • <catalog-name>:將包含 table 的目錄名稱。

    這不能是 hive_metastore 針對與 Azure Databricks 工作區相關聯的 Hive 中繼存放區自動建立的目錄。 如果您要在工作區 的預設目錄中建立數據表,則可以卸除目錄名稱。

  • <schema-name>:將包含 table 的架構名稱。

  • <table-name>:數據表的名稱。

  • <column-specification>:每個數據行的名稱和數據類型。

SQL

CREATE TABLE <catalog-name>.<schema-name>.<table-name>
(
  <column-specification>
);

Python

spark.sql("CREATE TABLE <catalog-name>.<schema-name>.<table-name> "
  "("
  "  <column-specification>"
  ")")

R

library(SparkR)

sql(paste("CREATE TABLE <catalog-name>.<schema-name>.<table-name> ",
  "(",
  "  <column-specification>",
  ")",
  sep = ""))

Scala

spark.sql("CREATE TABLE <catalog-name>.<schema-name>.<table-name> " +
  "(" +
  "  <column-specification>" +
  ")")

您也可以使用 Databricks Terraform 提供者databricks_table來建立受控數據表。 您可以使用databricks_tables來擷取資料表完整名稱的清單。

例如,若要建立數據表 main.default.department ,並將五個數據列插入其中:

SQL

CREATE TABLE main.default.department
(
  deptcode  INT,
  deptname  STRING,
  location  STRING
);

INSERT INTO main.default.department VALUES
  (10, 'FINANCE', 'EDINBURGH'),
  (20, 'SOFTWARE', 'PADDINGTON'),
  (30, 'SALES', 'MAIDSTONE'),
  (40, 'MARKETING', 'DARLINGTON'),
  (50, 'ADMIN', 'BIRMINGHAM');

Python

spark.sql("CREATE TABLE main.default.department "
  "("
  "  deptcode  INT,"
  "  deptname  STRING,"
  "  location  STRING"
  ")"
  "INSERT INTO main.default.department VALUES "
  "  (10, 'FINANCE', 'EDINBURGH'),"
  "  (20, 'SOFTWARE', 'PADDINGTON'),"
  "  (30, 'SALES', 'MAIDSTONE'),"
  "  (40, 'MARKETING', 'DARLINGTON'),"
  "  (50, 'ADMIN', 'BIRMINGHAM')")

R

library(SparkR)

sql(paste("CREATE TABLE main.default.department ",
  "(",
  "  deptcode  INT,",
  "  deptname  STRING,",
  "  location  STRING",
  ")",
  "INSERT INTO main.default.department VALUES ",
  "  (10, 'FINANCE', 'EDINBURGH'),",
  "  (20, 'SOFTWARE', 'PADDINGTON'),",
  "  (30, 'SALES', 'MAIDSTONE'),",
  "  (40, 'MARKETING', 'DARLINGTON'),",
  "  (50, 'ADMIN', 'BIRMINGHAM')",
  sep = ""))

Scala

spark.sql("CREATE TABLE main.default.department " +
  "(" +
  "  deptcode  INT," +
  "  deptname  STRING," +
  "  location  STRING" +
  ")" +
  "INSERT INTO main.default.department VALUES " +
  "  (10, 'FINANCE', 'EDINBURGH')," +
  "  (20, 'SOFTWARE', 'PADDINGTON')," +
  "  (30, 'SALES', 'MAIDSTONE')," +
  "  (40, 'MARKETING', 'DARLINGTON')," +
  "  (50, 'ADMIN', 'BIRMINGHAM')")

卸除受控數據表

您必須是數據表的擁有者,才能卸除數據表。 若要卸除受控數據表,請執行下列 SQL 命令:

DROP TABLE IF EXISTS catalog_name.schema_name.table_name;

卸除受控數據表時,其基礎數據會在 30 天內從您的雲端租用戶中刪除。

建立外部資料表

外部數據表中的數據會儲存在雲端租用戶的路徑中。 為了使用外部數據表,Unity 目錄引進兩個物件來存取和使用外部雲端記憶體:

  • 記憶體認證包含用來存取雲端儲存位置的驗證方法。 記憶體認證不包含它授與存取權路徑的對應。 儲存體 認證會受到訪問控制,以判斷哪些使用者可以使用認證。
  • 外部位置會將記憶體認證對應至其授與存取權的雲端記憶體路徑。 外部位置只會授與該雲端記憶體路徑及其內容的存取權。 外部位置會受到訪問控制,以判斷哪些使用者可以使用這些位置。 當您的 SQL 命令包含 LOCATION 子句時,會自動使用外部位置。

需求

若要建立外部數據表,您必須具有:

  • 外部 CREATE EXTERNAL TABLE 位置的許可權,授與外部數據表所存取的存取 LOCATION 權。
  • USE SCHEMA數據表父架構的許可權。
  • USE CATALOG數據表父目錄的許可權。
  • CREATE TABLE數據表父架構的許可權。

外部位置和記憶體認證會儲存在中繼存放區層級,而不是儲存在目錄中。 若要建立記憶體認證,您必須是帳戶管理員或具有 CREATE STORAGE CREDENTIAL 許可權。 若要建立外部位置,您必須是中繼存放區管理員或具有 CREATE EXTERNAL LOCATION 許可權。 請參閱使用 Unity 目錄將 連線 至雲端物件記憶體。

建立表格

在筆記本或 SQL 查詢編輯器中使用下列其中一個命令範例來建立外部數據表。

您也可以使用範例 筆記本 來建立記憶體認證、外部位置和外部數據表,以及管理其許可權。

在下列範例中,取代佔位元值:

  • <catalog>:將包含資料表的目錄名稱。

    這不能是 hive_metastore 針對與 Azure Databricks 工作區相關聯的 Hive 中繼存放區自動建立的目錄。 如果您要在工作區 的預設目錄中建立數據表,則可以卸除目錄名稱。

  • <schema>:將包含資料表的架構名稱。

  • <table-name>:數據表的名稱。

  • <column-specification>:每個數據行的名稱和數據類型。

  • <bucket-path>:將建立數據表之雲端記憶體貯體的路徑。

  • <table-directory>:將建立資料表的目錄。 針對每個數據表使用唯一目錄。

重要

在路徑中建立數據表之後,即使使用者已獲得外部位置或記憶體認證的許可權,也無法從 Azure Databricks 直接存取該路徑中的檔案。 這是為了確保使用者無法藉由直接從雲端租用戶讀取檔案來規避套用至數據表的訪問控制。

SQL

CREATE TABLE <catalog>.<schema>.<table-name>
(
  <column-specification>
)
LOCATION 'abfss://<bucket-path>/<table-directory>';

Python

spark.sql("CREATE TABLE <catalog>.<schema>.<table-name> "
  "("
  "  <column-specification>"
  ") "
  "LOCATION 'abfss://<bucket-path>/<table-directory>'")

R

library(SparkR)

sql(paste("CREATE TABLE <catalog>.<schema>.<table-name> ",
  "(",
  "  <column-specification>",
  ") ",
  "LOCATION 'abfss://<bucket-path>/<table-directory>'",
  sep = ""))

Scala

spark.sql("CREATE TABLE <catalog>.<schema>.<table-name> " +
  "(" +
  "  <column-specification>" +
  ") " +
  "LOCATION 'abfss://<bucket-path>/<table-directory>'")

Unity 目錄會檢查您是否具有下列許可權:

  • CREATE EXTERNAL TABLE 在參考您指定之雲端記憶體路徑的外部位置上。
  • CREATE TABLE 在父架構上。
  • USE SCHEMA 在父架構上。
  • USE CATALOG 在父目錄上。

如果您這麼做,就會建立外部數據表。 否則,會發生錯誤,而且不會建立外部數據表。

注意

您可以改為將Hive中繼存放區中的現有外部數據表移轉至 Unity 目錄,而不複製其數據。 請參閱 使用升級精靈將單一 Hive 數據表升級至 Unity 目錄外部數據表。

您也可以使用 Databricks Terraform 提供者databricks_table來建立外部數據表。 您可以使用databricks_tables來擷取資料表完整名稱的清單。

範例筆記本:建立外部數據表

您可以使用下列範例筆記本來建立目錄、架構和外部數據表,以及管理其許可權。

在 Unity 目錄筆記本中建立和管理外部數據表

取得筆記本

從儲存在雲端租用戶的檔案建立數據表

您可以在受控或外部數據表中填入儲存在雲端租使用者的檔案中的記錄。 Unity 目錄會讀取位於該位置的檔案,並將其內容插入數據表中。 在 Unity 目錄中,這稱為 路徑型存取

您可以遵循本節中的範例,或使用 新增數據 UI

探索檔案的內容

若要在從該資料建立資料表之前探索儲存在外部位置的數據,您可以使用目錄總管或下列命令。

需要許可權:您必須擁有 READ FILES 與雲端記憶體路徑相關聯的外部位置許可權,才能傳回該位置中的數據檔案清單。

Sql

  1. 列出雲端記憶體路徑中的檔案:

    LIST 'abfss://<path-to-files>';
    
  2. 查詢指定路徑中檔案中的資料:

    SELECT * FROM <format>.`abfss://<path-to-files>`;
    

Python

  1. 列出雲端記憶體路徑中的檔案:

    display(spark.sql("LIST 'abfss://<path-to-files>'"))
    
  2. 查詢指定路徑中檔案中的資料:

    display(spark.read.load("abfss://<path-to-files>"))
    

R

  1. 列出雲端記憶體路徑中的檔案:

    library(SparkR)
    
    display(sql("LIST 'abfss://<path-to-files>'"))
    
  2. 查詢指定路徑中檔案中的資料:

    library(SparkR)
    
    display(loadDF("abfss://<path-to-files>"))
    

Scala

  1. 列出雲端記憶體路徑中的檔案:

    display(spark.sql("LIST 'abfss://<path-to-files>'"))
    
  2. 查詢指定路徑中檔案中的資料:

    display(spark.read.load("abfss://<path-to-files>"))
    

從檔案建立數據表

請遵循本節中的範例來建立新的數據表,並在您的雲端租使用者上填入數據檔。

注意

您可以改為將Hive中繼存放區中的現有外部數據表移轉至 Unity 目錄,而不複製其數據。 請參閱 使用升級精靈將單一 Hive 數據表升級至 Unity 目錄外部數據表。

重要

  • 當您使用此方法建立數據表時,記憶體路徑只會讀取一次,以避免重複記錄。 如果您想要重新讀取目錄的內容,您必須卸除並重新建立數據表。 對於現有的數據表,您可以從 記憶體路徑插入記錄
  • 您建立資料表的貯體路徑也無法用來讀取或寫入資料檔。
  • 只會讀取確切目錄中的檔案;讀取不是遞歸的。
  • 您必須具有下列權限:
    • USE CATALOG 在父目錄和 USE SCHEMA 架構上。
    • CREATE TABLE 在父架構上。
    • READ FILES 位於與檔案所在貯體路徑相關聯的外部位置,如果您不是使用外部位置,則直接位於記憶體認證上。
    • 如果您要建立外部數據表,則需要 CREATE EXTERNAL TABLE 建立數據表的貯體路徑。

若要建立新的受控數據表,並在您的雲端記憶體中填入數據,請使用下列範例。

SQL

CREATE TABLE <catalog>.<schema>.<table-name>
(
  <column-specification>
)
SELECT * from <format>.`abfss://<path-to-files>`;

Python

spark.sql("CREATE TABLE <catalog>.<schema>.<table-name> "
  "( "
  "  <column-specification> "
  ") "
  "SELECT * from <format>.`abfss://<path-to-files>`")

R

library(SparkR)

sql(paste("CREATE TABLE <catalog>.<schema>.<table-name> ",
  "( ",
  "  <column-specification> ",
  ") ",
  "SELECT * from <format>.`abfss://<path-to-files>`",
  sep = ""))

Scala

spark.sql("CREATE TABLE <catalog>.<schema>.<table-name> " +
  "( " +
  "  <column-specification> " +
  ") " +
  "SELECT * from <format>.`abfss://<path-to-files>`")

若要建立外部數據表,並在雲端記憶體中填入數據,請新增 LOCATION 子句:

SQL

CREATE TABLE <catalog>.<schema>.<table-name>
(
    <column-specification>
)
USING <format>
LOCATION 'abfss://<table-location>'
SELECT * from <format>.`abfss://<path-to-files>`;

Python

spark.sql("CREATE TABLE <catalog>.<schema>.<table-name> "
  "( "
  "  <column-specification> "
  ") "
  "USING <format> "
  "LOCATION 'abfss://<table-location>' "
  "SELECT * from <format>.`abfss://<path-to-files>`")

R

library(SparkR)

sql(paste("CREATE TABLE <catalog>.<schema>.<table-name> ",
  "( ",
  "  <column-specification> ",
  ") ",
  "USING <format> ",
  "LOCATION 'abfss://<table-location>' ",
  "SELECT * from <format>.`abfss://<path-to-files>`",
  sep = ""))

Scala

spark.sql("CREATE TABLE <catalog>.<schema>.<table-name> " +
  "( " +
  "  <column-specification> " +
  ") " +
  "USING <format> " +
  "LOCATION 'abfss://<table-location>' " +
  "SELECT * from <format>.`abfss://<path-to-files>`")

將路徑的記錄插入現有數據表

若要將記錄從貯體路徑插入現有的數據表中,請使用 COPY INTO 命令。 在下列範例中,取代佔位元值:

  • <catalog>:資料表父目錄的名稱。
  • <schema>:資料表父架構的名稱。
  • <path-to-files>:包含數據檔的貯體路徑。
  • <format>:檔案的格式,例如 delta
  • <table-location>:將建立數據表的貯體路徑。

重要

  • 當您使用此方法將記錄插入資料表時,您提供的貯體路徑只會讀取一次,以避免重複記錄。
  • 您建立資料表的貯體路徑也無法用來讀取或寫入資料檔。
  • 只會讀取確切目錄中的檔案;讀取不是遞歸的。
  • 您必須具有下列權限:
    • USE CATALOG 在父目錄和 USE SCHEMA 架構上。
    • MODIFY 資料表上的 。
    • READ FILES 位於與檔案所在貯體路徑相關聯的外部位置,如果您不是使用外部位置,則直接位於記憶體認證上。
    • 若要將記錄插入外部數據表,您需要 CREATE EXTERNAL TABLE 在數據表所在的貯體路徑上。

若要將記錄從貯體路徑中的檔案插入Managed資料表,請使用外部位置從貯體路徑讀取:

SQL

COPY INTO <catalog>.<schema>.<table>
FROM (
  SELECT *
  FROM 'abfss://<path-to-files>'
)
FILEFORMAT = <format>;

Python

spark.sql("COPY INTO <catalog>.<schema>.<table> "
  "FROM ( "
  "  SELECT * "
  "  FROM 'abfss://<path-to-files>' "
  ") "
  "FILEFORMAT = <format>")

R

library(SparkR)

sql(paste("COPY INTO <catalog>.<schema>.<table> ",
  "FROM ( ",
  "  SELECT * ",
  "  FROM 'abfss://<path-to-files>' ",
  ") ",
  "FILEFORMAT = <format>",
  sep = ""))

Scala

spark.sql("COPY INTO <catalog>.<schema>.<table> " +
  "FROM ( " +
  "  SELECT * " +
  "  FROM 'abfss://<path-to-files>' " +
  ") " +
  "FILEFORMAT = <format>")

若要插入外部資料表,請新增 LOCATION 子句:

SQL

COPY INTO <catalog>.<schema>.<table>
LOCATION 'abfss://<table-location>'
FROM (
  SELECT *
  FROM 'abfss://<path-to-files>'
)
FILEFORMAT = <format>;

Python

spark.sql("COPY INTO <catalog>.<schema>.<table> "
  "LOCATION 'abfss://<table-location>' "
  "FROM ( "
  "  SELECT * "
  "  FROM 'abfss://<path-to-files>' "
  ") "
  "FILEFORMAT = <format>")

R

library(SparkR)

sql(paste("COPY INTO <catalog>.<schema>.<table> ",
  "LOCATION 'abfss://<table-location>' ",
  "FROM ( ",
  "  SELECT * ",
  "  FROM 'abfss://<path-to-files>' ",
  ") ",
  "FILEFORMAT = <format>",
  sep = ""))

Scala

spark.sql("COPY INTO <catalog>.<schema>.<table> " +
  "LOCATION 'abfss://<table-location>' " +
  "FROM ( " +
  "  SELECT * " +
  "  FROM 'abfss://<path-to-files>' " +
  ") " +
  "FILEFORMAT = <format>")

將批註新增至數據表

身為數據表擁有者或具有 MODIFY 數據表許可權的使用者,您可以將批註新增至數據表及其數據行。 您可以使用下列功能來新增註解:

  • COMMENT ON 命令。 此選項不支援資料行批注。
  • COMMENT當您使用 CREATE TABLE 和 ALTER TABLE 命令時的選項。 此選項支援資料行批注。
  • 目錄總管中的 [手動] 批注字段。 此選項支援資料行批注。 請參閱 使用 Markdown 批注在目錄總管中的文件數據。
  • 目錄總管中 AI 產生的批注(也稱為 AI 產生的檔)。 您可以檢視大型語言模型 (LLM) 建議的批注,該模型會考慮數據表元數據,例如數據表架構和數據行名稱,以及編輯或接受批注即為新增。 請參閱 將 AI 產生的批註新增至數據表

下一步