Unity Catalog でテーブルを作成する

この記事では、 マネージド テーブルと 外部 テーブルの概念について説明し、Unity Catalogでテーブルを作成する方法について説明します。

Note

テーブルを作成するときは、必ず Unity Catalog が管理するカタログを参照するか、"既定のカタログ" を Unity Catalog が管理するカタログに設定します。既定のカタログを管理する」を参照してください。

カタログ hive_metastore は Catalog Explorerに表示されますが、Unity Catalog によって管理されているとは見なされません。 これは、Azure Databricks ワークスペースの Hive メタストアによって管理されます。 リストにある他のすべてのカタログは、Unity Catalog によって管理されます。

Unity Catalog テーブルのアップグレード インターフェイスを使用して、Hive メタストアに登録されている既存のテーブルを Unity Catalog にアップグレードできます。 「Hive のテーブルとビューを Unity Catalog にアップグレードする」を参照してください。

マネージド テーブル

マネージド テーブルは、Unity Catalog にテーブルを作成する際の既定の方法です。 Unity Catalog で、これらのテーブルのライフサイクルとファイル レイアウトを管理します。 Azure Databricks の外部のツールを使用して、これらのテーブル内のファイルを直接操作しないでください。

マネージド テーブルは、スキーマとカタログの構成方法に応じて、メタストア、カタログ、またはスキーマ レベルで "マネージド ストレージ" に保存されます。Unity Catalog の管理されたストレージの場所の指定」を参照してください。

マネージド テーブルでは、常に Delta テーブル形式を使用します。

マネージド テーブルをドロップすると、基になるデータがクラウド テナントから 30 日以内に削除されます。

外部テーブル

外部テーブルは、メタストア、カタログ、またはスキーマに対して指定されたマネージド ストレージの場所の外部にデータが格納されているテーブルです。 外部テーブルは、Azure Databricks クラスターまたは Databricks SQL ウェアハウスの外部のデータに直接アクセスする必要がある場合にのみ使用します。

外部テーブルで DROP TABLE を実行しても、Unity Catalog では基になるデータは削除されません。 テーブルをドロップするには、その所有者である必要があります。 外部テーブルに対する権限を管理し、マネージド テーブルと同じ方法でクエリ内で使用できます。 SQL を使用して外部テーブルを作成するには、CREATE TABLE ステートメントで LOCATION パスを指定します。 外部テーブルでは次のファイル形式を使用できます。

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

外部テーブルの基になるクラウド ストレージへのアクセスを管理するために、ストレージ資格情報と外部の場所を設定する必要があります。

詳細については、「外部テーブルを作成する」を参照してください。

要件

テーブルを作成するスキーマに対する CREATE TABLE 特権と、同様にスキーマに対するUSE SCHEMA特権と親カタログに対する USE CATALOG特権が必要です。

外部テーブルを作成している場合の追加要件については、「外部テーブルを作成する」を参照してください。

マネージド テーブルを作成する

マネージド テーブルを作成するには、次の SQL コマンドを実行します。 ノートブックの例を使用してテーブルを作成することもできます。 角かっこ内の項目は省略可能です。 プレースホルダー値を次のように置き換えます。

  • <catalog-name>: テーブルを含むカタログの名前。

    これは、Azure Databricks ワークスペースに関連付けられている Hive メタストア用に自動的に作成される hive_metastoreカタログにはなりません。 ワークスペースの既定のカタログにテーブルを作成している場合は、カタログ名をドロップできます。

  • <schema-name>: テーブルを含めるスキーマの名前。

  • <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 を作成し、そこに 5 つの行を挿入するには、次のようにします。

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')")

ノートブックの例: マネージド テーブルを作成する

次のノートブックの例を使用して、カタログ、スキーマ、およびマネージド テーブルを作成し、それらに対する権限を管理できます。

Python ノートブックを使用して Unity Catalog にテーブルを作成し管理する

ノートブックを入手

SQL ノートブックを使用して Unity Catalog にテーブルを作成し管理する

ノートブックを入手

マネージド テーブルをドロップする

テーブルをドロップするには、テーブルの所有者である必要があります。 マネージド テーブルをドロップするには、次の SQL コマンドを実行します:

DROP TABLE IF EXISTS catalog_name.schema_name.table_name;

マネージド テーブルをドロップすると、基になるデータがクラウド テナントから 30 日以内に削除されます。

外部テーブルを作成する

外部テーブルのデータは、クラウド テナントのパスに格納されます。 外部テーブルを操作するために、Unity Catalog では、外部クラウド ストレージにアクセスして操作するための 2 つのオブジェクトが導入されています。

  • ストレージ資格情報には、クラウド ストレージの場所にアクセスするための認証方法が含まれています。 ストレージ資格情報には、アクセスを許可するパスへのマッピングは含まれていません。 ストレージ資格情報は、資格情報を使用できるユーザーを決定するためにアクセス制御されます。
  • 外部の場所では、ストレージの資格情報の、アクセスを許可するクラウド ストレージ パスへのマッピングが行われます。 外部の場所では、そのクラウド ストレージ パスとその内容へのアクセスのみが許可されます。 外部の場所は、使用できるユーザーを決定するためにアクセス制御されます。 外部の場所は、SQL のコマンドに LOCATION 句が含まれていない場合に、自動的に使用されます。

要件

外部テーブルを作成するには、次のものが必要です。

  • 外部テーブルによってアクセスされる、LOCATION へのアクセスを許可する外部の場所に対する CREATE EXTERNAL TABLE 権限。
  • テーブルの親スキーマに対する USE SCHEMA 権限。
  • テーブルの親カタログに対する USE CATALOG 権限。
  • テーブルの親スキーマに対する CREATE TABLE 権限。

外部の場所とストレージの資格情報は、カタログではなくメタストア レベルに格納されます。 ストレージ資格情報を作成するには、アカウント管理者であるか、CREATE STORAGE CREDENTIAL 特権を持っている必要があります。 外部の場所を作成するには、CREATE EXTERNAL LOCATION 特権を持つメタストア管理者である必要があります。 「Unity Catalog を使用してクラウド オブジェクト ストレージに接続する」を参照してください。

テーブルを作成する

ノートブックまたは SQL クエリ エディターで次のいずれかのコマンド例を使用して、外部テーブルを作成します。

また、ノートブックの例を使用して、ストレージ資格情報、外部の場所、外部テーブルを作成し、それらについての権限を管理することもできます。

次の例では、プレースホルダー値を置き換えます。

  • <catalog>: テーブルを含むカタログの名前。

    これは、Azure Databricks ワークスペースに関連付けられている Hive メタストア用に自動的に作成される hive_metastoreカタログにはなりません。 ワークスペースの既定のカタログにテーブルを作成している場合は、カタログ名をドロップできます。

  • <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 Catalog では、次のアクセス許可が付与されていることが確認されます。

  • 指定するクラウド ストレージ パスを参照する外部の場所に対する CREATE EXTERNAL TABLE
  • 親スキーマに対する CREATE TABLE
  • 親スキーマに対する USE SCHEMA
  • 親カタログに対する USE CATALOG

そうすると、外部テーブルが作成されます。 そうでない場合は、エラーが発生し、外部テーブルは作成されません。

Note

代わりに、データを複製することなく、Hive メタストア内の既存の外部テーブルを Unity Catalog に移行できます。 「アップグレード ウィザードを使用して単一の Hive テーブルを Unity Catalog の外部テーブルにアップグレードする」を参照してください。

また、Databricks Terraform プロバイダーdatabricks_table を使用して外部テーブルを作成することもできます。 databricks_tables を使用して、テーブルのフル ネームのリストを取得できます。

ノートブックの例: 外部テーブルを作成する

次のノートブックの例を使用すると、カタログ、スキーマ、およびテーブルを作成し、それらのアクセス許可を管理できます。

Unity Catalog ノートブックで外部テーブルを作成し管理する

ノートブックを入手

クラウド テナントに格納されているファイルからテーブルを作成する

マネージド テーブルまたは外部テーブルに、クラウド テナントに格納されているファイルのレコードからデータを挿入できます。 Unity Catalog では、その場所にあるファイルを読み取り、その内容をテーブルに挿入します。 Unity Catalog では、これはパスベースのアクセスと呼ばれます。

このセクションの例に従うか、データの追加 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>"))
    

ファイルからテーブルを作成する

このセクションの例に従って、新しいテーブルを作成し、クラウド テナント上のデータ ファイルを設定します。

Note

代わりに、データを複製することなく、Hive メタストア内の既存の外部テーブルを Unity Catalog に移行できます。 「アップグレード ウィザードを使用して単一の Hive テーブルを Unity Catalog の外部テーブルにアップグレードする」を参照してください。

重要

  • この方法を使用してテーブルを作成すると、レコードの重複を防ぐために、ストレージ パスの読み取りは 1 回だけ行われます。 ディレクトリの内容を再読み取りする場合は、テーブルをドロップして再作成する必要があります。 既存のテーブルについては、ストレージ パスからレコードを挿入できます。
  • テーブルを作成するバケット パスを、データ ファイルの読み取りまたは書き込みにも使用することはできません。
  • 厳密にディレクトリ内にあるファイルだけが読み取りされます。読み取りは再帰的ではありません。
  • 次のアクセス許可を持っている必要があります。
    • 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>: テーブルが作成されるバケット パス。

重要

  • この方法を使用してテーブルにレコードを挿入すると、レコードの重複を防ぐために、指定したバケット パスの読み取りは 1 回だけ行われます。
  • テーブルを作成するバケット パスを、データ ファイルの読み取りまたは書き込みにも使用することはできません。
  • 厳密にディレクトリ内にあるファイルだけが読み取りされます。読み取りは再帰的ではありません。
  • 次のアクセス許可を持っている必要があります。
    • USE CATALOG親カタログに対してとUSE SCHEMAスキーマに対して。
    • テーブルに対する MODIFY
    • ファイルが格納されているバケット パスに関連付けられている外部の場所、または外部の場所を使用していない場合は直接のストレージの資格情報に対する READ FILES
    • 外部テーブルにレコードを挿入するには、テーブルが位置するバケット パスに対する CREATE EXTERNAL TABLE が必要です。

外部の場所を使用してバケット パスから読み取りを行って、バケット パス内のファイルからマネージド テーブルにレコードを挿入するには、次のようにします。

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 コマンド。 このオプションは列のコメントをサポートしていません。
  • CREATE TABLE および ALTER TABLE コマンドを使用する場合の COMMENT オプション。 このオプションは列コメントをサポートしています。
  • カタログ エクスプローラーの “手動” コメント フィールド。 このオプションは列コメントをサポートしています。 「Markdown コメントを使用して Catalog Explorer でデータをドキュメント化する」を参照してください。
  • カタログ エクスプローラーの AI 生成コメント (AI 生成ドキュメントとも呼ばれます)。 テーブル スキーマや列の名前などのテーブルのメタデータを考慮に入れた大規模言語モデル (LLM) によって提案されたコメントを表示できます。また、コメントを編集するか、そのまま受け入れて追加できます。 「AI によって生成されたコメントをテーブルに追加する」を参照してください。

次のステップ