Create tables | Databricks on AWS [2023/1/20時点]の翻訳です。
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
本書では、Unity Catalogにおけるマネージドテーブルと外部テーブルのコンセプトを紹介し、Unity Catalogでどのようにテーブルを作成するのかを説明します。
注意
テーブルを作成する際、Unity Catalogによって管理されているカタログを参照していることを確認してください。カタログhive_metastore
はデータエクスプローラに表示されますが、Unity Catalogによって管理されているとはみなされません。これはDatabricksワークスペースのHiveメタストアによって管理されています。それ以外のカタログはすべてUnity Catalogによって管理されます。
Hiveメタストアに登録されている既存のテーブルをUnity CatalogにアップグレードするためのUnity Catalogテーブルアップグレードインタフェースを活用することができます。テーブルとビューをUnity Catalogにアップグレードするをご覧ください。
マネージドテーブル
マネージドテーブルは、Unity Catalogでテーブルを作成するデフォルトの手法となります。これらは、Deltaテーブルフォーマットを使用します。
デフォルトでは、メタストアを作成する際に設定したルートストレージロケーションにマネージドテーブルは格納されます。しかし、カタログやスキーマレベルで別のストレージロケーションを指定することができます。マネージドテーブルのデータは、ロケーションが指定された階層構造の最下層のレベルに格納されます。例えば、スキーマのロケーションが指定されるとそれが使用されます。もし、スキーマロケーションが指定され無い場合、カタログのロケーションが使用され、カタログのロケーションが指定されない場合には、デフォルトメタストアのルートロケーションが使用されます。
外部テーブル
外部テーブルは、データがルートストレージロケーションの外に格納されるテーブルです。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>
: カタログ名です。お使いのDatabricksワークスペースに紐付けられるHiveメタストアで自動で作成されるhive_metastore
カタログを指定することはできません。 -
<schema_name>
: スキーマ名です。 -
<table_name>
: テーブル名です。 -
<column_specification>
: カラムごとの名前とデータ型です。
CREATE TABLE <catalog_name>.<schema_name>.<table_name>
(
<column_specification>
);
spark.sql("CREATE TABLE <catalog_name>.<schema_name>.<table_name> "
"("
" <column_specification>"
")")
library(SparkR)
sql(paste("CREATE TABLE <catalog_name>.<schema_name>.<table_name> ",
"(",
" <column_specification>",
")",
sep = ""))
spark.sql("CREATE TABLE <catalog_name>.<schema_name>.<table_name> " +
"(" +
" <column_specification>" +
")")
また、Databricks Terraformプロバイダーとdatabricks_tableを用いることでマネージドテーブルを作成することができます。databricks_tablesを用いることでテーブルの完全な名称のリストを取得することができます。
例えば、main.default.department
というテーブルを作成し、5行をインサートします。
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');
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')")
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 = ""))
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を用いたUnity Catalogにおけるテーブルの作成と管理
Pythonを用いたUnity Catalogにおけるテーブルの作成と管理
マネージドテーブルの削除
マネージドテーブルを削除するには、以下のSQLコマンドを実行します。
DROP TABLE IF EXISTS catalog_name.schema_name.table_name;
マネージドテーブルを削除すると、30日以内にお使いのクラウドテナントから背後のデータが削除されます。
外部テーブルの作成
外部テーブルのデータはお使いのクラウドテナントのパスに格納されます。外部テーブルを操作するために、Unity Catalogでは外部クラウドストレージにアクセスし操作するために新たに2つのオブジェクトを導入しています。
-
ストレージ資格情報には、クラウドストレージロケーションにアクセスするための認証手段が格納されます。ストレージ資格情報には、アクセスを許可するパスへのマッピングは含まれません。ストレージ資格情報は、どのユーザーが資格情報を使用できるのかを制御できるようにアクセスコントロールされます。直接外部のストレージ資格情報を使用するには、SQLコマンドに
WITH <credential_name>
を追加します。 -
外部ロケーションは、ストレージ資格情報とアクセスを許可するクラウドストレージパスをマッピングします。外部ロケーションは、当該のクラウドストレージパスとコンテンツに対してのみアクセスを許可します。どのユーザーが外部ロケーションを使用できるのかを決定するために、外部ロケーションはアクセスコントロールされます。外部ロケーションは、
LOCATION
句を含み、WITH <credential_name>
を持たないSQLコマンドで自動で使用されます。
要件
- 外部テーブルを作成するには以下の権限が必要となります。
- 外部テーブルによってアクセスされる
LOCATION
へのアクセスを許可する外部ロケーション、ストレージ資格情報におけるCREATE EXTERNAL TABLE
権限。 - テーブルの親スキーマにおける
USE SCHEMA
権限。 - テーブルの親カタログにおける
USE CATALOG
権限。 - テーブルの親スキーマにおける
CREATE TABLE
権限。
- 外部テーブルによってアクセスされる
外部ロケーションとストレージ資格情報はカタログではなく、メタストアのトップレベルに格納されます。ストレージ資格情報や外部ロケーションを作成するには、メタストア管理者あるいはアカウントレベルの管理者である必要があります。Unity Catalogにおける外部ロケーションとストレージ認証情報の管理をご覧ください。
外部テーブルを作成するには、これらのハイレベルのステップに従ってください。また、ストレージ資格情報、外部ロケーション、外部テーブルを作成し、権限を管理するために、サンプルノートブックを活用することができます。
外部テーブルの作成
外部ロケーション(推奨)あるいは直接ストレージ資格情報を用いて外部テーブルを作成することができます。以下のサンプルではプレースホルダーの値を置き換えてください。
-
<catalog>
: テーブルを格納するカタログ名です。 -
<schema>
: テーブルを格納するスキーマ名です。 -
<table_name>
: テーブル名です。 -
<column_specification>
: カラムごとの名称とデータ型です。 -
<bucket_path>
: テーブルが作成されるお使いのクラウドテナント上のパスです。 -
<table_directory>
: テーブルが作成されるディレクトリです。テーブルごとにユニークなディレクトリを使用してください。
重要!
パスにテーブルが作成されると、外部ロケーションやストレージ資格情報で権限が付与されていたとしても、ユーザーは当該パスに直接アクセスできなくなります。これは、クラウドテナントで直接ファイルを読み込むことで、適用されているアクセス制御を迂回することを防ぐためです。
外部ロケーションを用いた外部テーブルの作成
外部ロケーションを用いて空の外部テーブルを作成するには:
CREATE TABLE <catalog>.<schema>.<table_name>
(
<column_specification>
)
LOCATION 's3://<bucket_path>/<table_directory>';
spark.sql("CREATE TABLE <catalog>.<schema>.<table_name> "
"("
" <column_specification>"
") "
"LOCATION 's3://<bucket_path>/<table_directory>'")
library(SparkR)
sql(paste("CREATE TABLE <catalog>.<schema>.<table_name> ",
"(",
" <column_specification>",
") ",
"LOCATION 's3://<bucket_path>/<table_directory>'",
sep = ""))
spark.sql("CREATE TABLE <catalog>.<schema>.<table_name> " +
"(" +
" <column_specification>" +
") " +
"LOCATION 's3://<bucket_path>/<table_directory>'")
Unity Catalogは、あなたが以下の権限を有しているかをチェックします。
- 指定したクラウドストレージを参照する外部ロケーションにおける
CREATE EXTERNAL TABLE
権限。 - 親スキーマにおける
CREATE TABLE
権限。 - 親スキーマにおける
USE SCHEMA
権限。 - 親カタログにおける
USE CATALOG
権限。
権限がある場合、外部テーブルが作成されます。そうでない場合、エラーが発生し外部テーブルは作成されません。
注意
データを複製することなしに、Hiveメタストアにある既存外部テーブルをUnity Catalogに移行することができます。外部テーブルをUnity Catalogにアップグレードするをご覧ください。
また、Databricks Terraformプロバイダーとdatabricks_tableを用いることでマネージドテーブルを作成することができます。databricks_tablesを用いることでテーブルの完全な名称のリストを取得することができます。
外部テーブル作成のサンプルノートブック
Unity Catalogにおける外部テーブルの作成と管理
お使いのクラウドテナントに格納されているファイルからのテーブルの作成
お使いのクラウドテナントに格納されているファイルのレコードを用いてマネージドテーブル、外部テーブルにデータを追加することができます。Unity Catalogは当該ロケーションのファイルを読み込み、そのコンテンツをテーブルにインサートします。Unity Catalogではこれをパスベースのアクセスと呼びます。
注意
外部テーブルを作成したストレージパスを、データファイルの読み書きに使用することはできません。
ファイルの中身の探索
データからテーブルを作成する前に、外部ロケーションに格納されているデータを探索するために、Data Explorerあるいは以下のコマンドを使用することができます。
アクセス権が必要です: 当該ロケーションのデータファイルの一覧を取得するには、クラウドストレージパスに関連づけられた外部ロケーションに対するREAD FILES
権限が必要となります。
SQL
-
クラウドストレージのファイルの一覧。
SQLLIST 's3://<path_to_files>';
-
指定されたパスのファイルのデータへのクエリー。
SQLSELECT * FROM <format>.'[s3://<path_to_files>';
Python
-
クラウドストレージのファイルの一覧。
Pythondisplay(spark.sql("LIST 's3://<path_to_files>'"))
-
指定されたパスのファイルのデータへのクエリー。
Pythondisplay(spark.read.load("s3://<path_to_files>"))
R
-
クラウドストレージのファイルの一覧。
Rlibrary(SparkR) display(sql("LIST 's3://<path_to_files>'"))
-
指定されたパスのファイルのデータへのクエリー。
Rlibrary(SparkR) display(loadDF("s3://<path_to_files>"))
Scala
-
クラウドストレージのファイルの一覧。
Scaladisplay(spark.sql("LIST 's3://<path_to_files>'"))
-
指定されたパスのファイルのデータへのクエリー。
Scaladisplay(spark.read.load("s3://<path_to_files>"))
ファイルからテーブルの作成
注意
データを複製することなしに、Hiveメタストアにある既存外部テーブルをUnity Catalogに移行することができます。外部テーブルをUnity Catalogにアップグレードするをご覧ください。
新規テーブルを作成し、お使いクラウドテナントのデータファイルのレコードを用いてデータを追加します。
重要!
- この方法でテーブルを作成する際、レコードの複製を防ぐために、このストレージパスは一度のみ読み込まれます。ディレクトリのコンテンツを再読み込みしたい場合、テーブルを削除して再作成しなくてはなりません。既存テーブルに対しては、ストレージパスからレコードをインサートすることができます。
- テーブルを作成したバケットパスは、データファイルの読み書きに使用することはできません。
- 指定されたディレクトリのファイルのみが読み込まれます。再起的な読み込みは行われません。
- 以下の権限が必要です。
- 親カタログに対する
USE CATALOG
、スキーマに対するUSE SCHEMA
権限。 - 親スキーマに対する
CREATE TABLE
権限。 - ファイルが格納されているバケットパスに関連づけられている外部ロケーション、外部ロケーションを使用していない場合はストレージ資格情報に対する
READ FILES
権限。 - 外部テーブルを作成する際、テーブルが作成されるバケットパスに対する
CREATE EXTERNAL TABLE
権限。
- 親カタログに対する
- マネージドテーブルを作成し、バケットパスのレコードを用いてデータを追加します。
CREATE TABLE <catalog>.<schema>.<table_name>
USING delta
(
<column_specification>
)
SELECT * from delta.`s3://<path_to_files>`;
spark.sql("CREATE TABLE <catalog>.<schema>.<table_name> "
"USING delta "
"( "
" <column_specification> "
") "
"SELECT * from delta.`s3://<path_to_files>`")
library(SparkR)
sql(paste("CREATE TABLE <catalog>.<schema>.<table_name> ",
"USING delta ",
"( ",
" <column_specification> ",
") ",
"SELECT * from delta.`s3://<path_to_files>`",
sep = ""))
spark.sql("CREATE TABLE <catalog>.<schema>.<table_name> " +
"USING delta " +
"( " +
" <column_specification> " +
") " +
"SELECT * from delta.`s3://<path_to_files>`")
- 外部テーブルを作成し、バケットパスのレコードを用いてデータを追加するには
LOCATION
を追加します。
CREATE TABLE <catalog>.<schema>.<table_name>
USING delta
(
<column_specification>
)
LOCATION 's3://<table_location>'
SELECT * from <format>.`s3://<path_to_files>`;
spark.sql("CREATE TABLE <catalog>.<schema>.<table_name> "
"USING delta "
"( "
" <column_specification> "
") "
"LOCATION 's3://<table_location>' "
"SELECT * from <format>.`s3://<path_to_files>`")
library(SparkR)
sql(paste("CREATE TABLE <catalog>.<schema>.<table_name> ",
"USING delta ",
"( ",
" <column_specification> ",
") ",
"LOCATION 's3://<table_location>' ",
"SELECT * from <format>.`s3://<path_to_files>`",
sep = ""))
spark.sql("CREATE TABLE <catalog>.<schema>.<table_name> " +
"USING delta " +
"( " +
" <column_specification> " +
") " +
"LOCATION 's3://<table_location>' " +
"SELECT * from <format>.`s3://<path_to_files>`")
パスから既存のテーブルにレコードをインサート
バケットパスにあるレコードを既存テーブルにインサートするには、COPY INTO
コマンドを使用します。以下のサンプルでは、プレースホルダーの値を置き換えてください。
-
<catalog>
: テーブルの親カタログの名称です。 -
<schema>
: テーブルの親スキーマの名称です。 -
<path_to_files>
: データファイルを格納するバケットパスです。 -
<format>
: ファイルのフォーマットです。 -
<table_location>
: テーブルが作成されるバケットパスです。 -
<storage_credential>
: ストレージ資格情報を直接使用している場合、バケットパスへの読み書きを認証するストレージ資格情報の名前です。
重要!
- この方法でテーブルにレコードをインサートする際、レコードの複製を防ぐために、このストレージパスは一度のみ読み込まれます。
- テーブルを作成したバケットパスは、データファイルの読み書きに使用することはできません。
- 指定されたディレクトリのファイルのみが読み込まれます。再起的な読み込みは行われません。
- 以下の権限が必要です。
- 親カタログに対する
USE CATALOG
、スキーマに対するUSE SCHEMA
権限。 - 親スキーマに対する
CREATE TABLE
権限。 - ファイルが格納されているバケットパスに関連づけられている外部ロケーション、外部ロケーションを使用していない場合はストレージ資格情報に対する
READ FILES
権限。 - 外部テーブルを作成する際、テーブルが作成されるバケットパスに対する
CREATE EXTERNAL TABLE
権限。
- 親カタログに対する
- バケットパスのファイルのレコードをマネージドテーブルにインサートする際、バケットパスから読み込みを行うための外部ロケーションを使用します。
COPY INTO <catalog>.<schema>.<table>
FROM (
SELECT *
FROM 's3://<path_to_files>'
)
FILEFORMAT = <format>;
spark.sql("COPY INTO <catalog>.<schema>.<table> "
"FROM ( "
" SELECT * "
" FROM 's3://<path_to_files>' "
") "
"FILEFORMAT = <format>")
library(SparkR)
sql(paste("COPY INTO <catalog>.<schema>.<table> ",
"FROM ( ",
" SELECT * ",
" FROM 's3://<path_to_files>' ",
") ",
"FILEFORMAT = <format>",
sep = ""))
spark.sql("COPY INTO <catalog>.<schema>.<table> " +
"FROM ( " +
" SELECT * " +
" FROM 's3://<path_to_files>' " +
") " +
"FILEFORMAT = <format>")
- 外部テーブルにインサートするには、
LOCATION
句を追加します。
COPY INTO <catalog>.<schema>.<table>
LOCATION 's3://<table_location>'
FROM (
SELECT *
FROM 's3://<path_to_files>'
)
FILEFORMAT = <format>;
spark.sql("COPY INTO <catalog>.<schema>.<table> "
"LOCATION 's3://<table_location>' "
"FROM ( "
" SELECT * "
" FROM 's3://<path_to_files>' "
") "
"FILEFORMAT = <format>")
library(SparkR)
sql(paste("COPY INTO <catalog>.<schema>.<table> ",
"LOCATION 's3://<table_location>' ",
"FROM ( ",
" SELECT * ",
" FROM 's3://<path_to_files>' ",
") ",
"FILEFORMAT = <format>",
sep = ""))
spark.sql("COPY INTO <catalog>.<schema>.<table> " +
"LOCATION 's3://<table_location>' " +
"FROM ( " +
" SELECT * " +
" FROM 's3://<path_to_files>' " +
") " +
"FILEFORMAT = <format>")