デルタ テーブルを作成する
Microsoft Fabric のレイクハウスにテーブルを作成すると、レイクハウスのメタストアに差分テーブルが定義され、テーブルのデータは、テーブルの基になる Parquet ファイルに保存されます。
Microsoft Fabric 環境のほとんどの対話型ツールでは、メタストア内のテーブル定義を基になるファイルにマッピングする詳細が取り除かれます。 ただし、レイクハウスで Apache Spark を使用する場合は、差分テーブルの作成と管理をより詳細に制御できます。
データフレームから差分テーブルを作成する
Spark で差分テーブルを作成する最も簡単な方法の 1 つは、データフレームを "差分" 形式で保存することです。 たとえば、次の PySpark コードは、既存ファイルのデータを含むデータフレームを読み込み、そのデータフレームを差分テーブルとして保存します。
# Load a file into a dataframe
df = spark.read.load('Files/mydata.csv', format='csv', header=True)
# Save the dataframe as a delta table
df.write.format("delta").saveAsTable("mytable")
このコードでは、テーブル名を指定して、差分形式でテーブルを保存するように指定します。 テーブルのデータは、レイクハウスの Tables ストレージ領域で、テーブルのトランザクション ログが含まれる _delta_log フォルダーと共に、Parquet ファイル (データフレームに読み込んだソース ファイルの形式に関係なく) に保存されます。 テーブルは、[データ エクスプローラー] ペインのレイクハウスの Tables フォルダーに一覧表示されます。
"マネージド" テーブルと "外部" テーブル
前の例で、データフレームは "マネージド" テーブルとして保存されました。これは、メタストア内のテーブル定義と基になるデータ ファイルの両方が、ファブリック レイクハウスの Spark ランタイムによって管理されることを意味します。 テーブルを削除すると、基になるファイルも、レイクハウスの保存場所 Tables から削除されます。
"外部" テーブルを作成することもできます。この場合は、メタストア内のリレーショナル テーブル定義が代替のファイル保存場所にマップされます。 たとえば、次のコードを使用して、レイクハウスの保存場所 Files のフォルダー内にデータが保存される外部テーブルを作成します。
df.write.format("delta").saveAsTable("myexternaltable", path="Files/myexternaltable")
この例では、テーブル定義はメタストアに作成されます (そのため、テーブルはレイクハウスの Tables ユーザー インターフェイスに一覧表示されます) が、テーブルの Parquet データ ファイルと JSON ログ ファイルは保存場所 Files 内に格納されます ([レイクハウス エクスプローラー] ペインの Files ノードに表示されます)。
次のように、保存場所に完全修飾パスを指定することもできます。
df.write.format("delta").saveAsTable("myexternaltable", path="abfss://my_store_url..../myexternaltable")
外部テーブルをレイクハウス メタストアから削除しても、関連付けられているデータ ファイルは削除されません。
テーブル メタデータを作成する
データフレーム内の既存のデータからテーブルを作成するのが一般的ですが、データが設定されるメタストアに他の方法でテーブル定義を作成したいシナリオもよくあります。 この目標を達成するには、複数の方法があります。
DeltaTableBuilder API を使用する
DeltaTableBuilder API を使用すると、仕様に基づいてテーブルを作成する Spark コードを記述できます。 たとえば、次のコードでは、名前と列を指定してテーブルを作成します。
from delta.tables import *
DeltaTable.create(spark) \
.tableName("products") \
.addColumn("Productid", "INT") \
.addColumn("ProductName", "STRING") \
.addColumn("Category", "STRING") \
.addColumn("Price", "FLOAT") \
.execute()
Spark SQL を使用する
次の例に示すように、Spark SQL CREATE TABLE
ステートメントを使用して差分テーブルを作成することもできます。
%%sql
CREATE TABLE salesorders
(
Orderid INT NOT NULL,
OrderDate TIMESTAMP NOT NULL,
CustomerName STRING,
SalesTotal FLOAT NOT NULL
)
USING DELTA
前の例では、マネージド テーブルを作成します。 次に示すように、LOCATION
パラメーターを指定して外部テーブルを作成することもできます。
%%sql
CREATE TABLE MyExternalTable
USING DELTA
LOCATION 'Files/mydata'
外部テーブルを作成する場合、テーブルのスキーマは、指定した場所にある、データが含まれる Parquet ファイルによって決定されます。 この方法は、既に差分形式で保存されているデータを参照するテーブル定義を作成したい場合や、差分形式でデータを取り込むことが予想されるフォルダーに基づいて作成する場合に便利です。
データを差分形式で保存する
ここまで、データフレームを差分テーブルとして保存する (メタストア内のテーブル スキーマ定義と差分形式のデータ ファイルの両方を作成する) 方法と、テーブル定義を作成する (データ ファイルを保存せずにメタストアにテーブル スキーマを作成する) 方法を見てきました。 3 つ目に考えられるのは、メタストアにテーブル定義を作成せずに差分形式でデータを保存する方法です。 この方法は、Spark で実行されたデータ変換の結果をファイル形式で保持する場合に便利です。これにより、後でデルタ レイク API を使用してテーブル定義またはプロセスを直接 "オーバーレイ" できます。
たとえば、次の PySpark コードを使用して、データフレームを "差分" 形式で新しいフォルダーの場所に保存します。
delta_path = "Files/mydatatable"
df.write.format("delta").save(delta_path)
デルタ ファイルは、指定したパスに Parquet 形式で保存されます。これにはトランザクション ログ ファイルを含む _delta_log フォルダーが含まれます。 トランザクション ログには、外部テーブルに対する変更やデルタ レイク API を介して行われた更新など、データの変更が記録されます。
次に示すように、上書きモードを使用して、既存のフォルダーの内容をデータフレーム内のデータと置き換えることができます。
new_df.write.format("delta").mode("overwrite").save(delta_path)
追加モードを使用して、データフレームから既存のフォルダーに行を追加することもできます。
new_rows_df.write.format("delta").mode("append").save(delta_path)
ヒント
ここで説明する手法を使用して、データフレームをレイクハウス内の場所 Tables に保存する場合、Microsoft Fabric によってテーブルの自動検出機能が使用され、対応するテーブル メタデータがメタストアに作成されます。