カタログ テーブルを作成する

完了

ここまでは、データフレームから作成され、Delta Lake API を介して変更された Delta Lake テーブル インスタンスを検討しました。 Spark プールの Hive メタストアで 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 句と共に USING DELTA SQL ステートメントを使用し、外部テーブルの省略可能な 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 ステートメントを使用できます。

テーブル スキーマの定義

ここまでのすべての例では、明示的なスキーマなしでテーブルが作成されています。 データフレームを記述して作成されたテーブルの場合、テーブル スキーマはデータフレームから継承されます。 外部テーブルを作成すると、スキーマは現在テーブルの場所に格納されているすべてのファイルから継承されます。 ただし、新しいマネージド テーブルまたは現在空の場所を持つ外部テーブルを作成する場合は、CREATE TABLE ステートメントの一部として列名、型、および null 許容値を指定してテーブル スキーマを定義します。次の例に示すように、

%%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 ドキュメントの テーブル バッチの読み取りと書き込みを 参照してください。