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 | 定価 |
---|---|---|
771 | Mountain-100 Silver、38 | 3399.9900 |
839 | ブラックロード-750、サイズ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 コード例では、ノートブックにテーブルとして自動的に表示される結果セットを返します。
カテゴリ | 製品数 |
---|---|
Bib-Shorts | 3 |
バイク ラック | 1 |
自転車スタンド | 1 |
... | ... |