Spark SQL を使用してデータを操作する

完了

Dataframe API は Spark SQL という名前の Spark ライブラリの一部であり、データ アナリストは SQL 式を使用してデータのクエリと操作を行います。

Spark カタログでデータベース オブジェクトを作成する

Spark カタログは、ビューやテーブルなどのリレーショナル データ オブジェクトのメタストアです。 Spark ランタイムでは、このカタログを使用して、任意の Spark 対応言語で記述されたコードと、一部のデータ アナリストや開発者にとってより自然な SQL 式をシームレスに統合できます。

Spark カタログでクエリを実行するためにデータフレーム内のデータを使用できるようにする最も簡単な方法の 1 つは、次のコード例に示すように、一時ビューを作成することです。

df.createOrReplaceTempView("products_view")

"ビュー" は一時的なもので、現在のセッションの終了時に自動的に削除されます。 また、カタログに保持される "テーブル" を作成して、Spark SQL を使用してクエリを実行できるデータベースを定義することもできます。

テーブルは、カタログに関連付けられているストレージの場所に、基になるデータを格納するメタデータ構造です。 Microsoft Fabric では、データ レイク内に示されているテーブル ストレージの場所に、"マネージド" テーブルのデータが格納されます。また、Spark を使用して作成されたテーブルはすべてそこに一覧表示されます。

空のテーブルを作成するには、spark.catalog.createTable メソッドを使用します。または、データフレームをテーブルとして保存するには、その saveAsTable メソッドを使用します。 マネージド テーブルを削除すると、その基になるデータも削除されます。

たとえば、次のコードを使用すると、データフレームが products という名前の新しいテーブルとして保存されます。

df.write.format("delta").saveAsTable("products")

注意

Spark カタログは、さまざまな形式のファイルに基づくテーブルをサポートしています。 Microsoft Fabric で推奨される形式は delta です。これは、Spark のリレーショナル データ テクノロジ向けの形式で、Delta Lake という名前が付けられています。 Delta テーブルは、トランザクションやバージョン管理など、リレーショナル データベース システムでよく見られる機能をサポートしているとともに、ストリーミング データにも対応しています。

また、spark.catalog.createExternalTable メソッドを使用すると、"外部" テーブルを作成できます。 外部テーブルを使用すると、カタログ内のメタデータを定義できますが、基になるデータは、外部ストレージの場所 (通常は、レイクハウスの Files ストレージ領域内にあるフォルダー) から取得できます。 外部テーブルを削除しても、基になるデータは削除されません。

ヒント

前のユニットで説明した Parquet ファイルと同様に、同じパーティション分割手法をデルタ レイク テーブルに適用できます。 テーブルをパーティション分割すると、そのテーブルのクエリを実行するときのパフォーマンスが向上する場合があります。

Spark SQL API を使用してデータのクエリを実行する

任意の言語で記述されたコードで Spark SQL API を使用して、カタログ内のデータに対してクエリを実行できます。 たとえば、次の PySpark コードでは、SQL クエリを使用して、products テーブルからデータをデータフレームとして返します。

bikes_df = spark.sql("SELECT ProductID, ProductName, ListPrice \
                      FROM products \
                      WHERE Category IN ('Mountain Bikes', 'Road Bikes')")
display(bikes_df)

このコード例の結果は、次の表のようになります。

ProductID ProductName ListPrice
771 Mountain-100 Silver, 38 3399.9900
839 Road-750 Black, 52 539.9900
... ... ...

SQL コードを使用する

前の例では、Spark SQL API を使用して、Spark コードに SQL 式を埋め込む方法を示しました。 また、ノートブックで %%sql マジックを使用して、次のようにカタログ内のオブジェクトに対してクエリを行う SQL コードを実行することもできます。

%%sql

SELECT Category, COUNT(ProductID) AS ProductCount
FROM products
GROUP BY Category
ORDER BY Category

この SQL コード例では、ノートブックにテーブルとして自動的に表示される結果セットを返します。

カテゴリ ProductCount
ビブショーツ 3
バイク ラック 1
バイク スタンド 1
... ...