Apache Parquet は、分析ワークロード用に最適化された列形式のファイル形式です。 これにより、クエリ エンジンは必要な列のみを読み取り、無関係な行グループをスキップできます。 Parquet は Delta Lake(/delta/index.md) の基になるストレージ形式であり、Azure Databricksに格納されるデータの最も一般的な形式です。 Azure Databricksでは、スキーマの仕様、パーティション分割、書き込みの圧縮など、Apache Spark での読み取りと書き込みの両方に Parquet がサポートされています。
前提条件
Azure Databricksでは、Parquet ファイルを使用するために追加の構成は必要ありません。 ただし、Parquet ファイルをストリーミングするには、 自動ローダーが必要です。
オプション
Parquet データ ソースを構成するには、.option()と.options()のDataFrameReaderおよびDataFrameWriterメソッドを使用します。 サポートされているオプションの完全な一覧については、「Parquet オプションのDataFrameReaderと Parquet オプションのDataFrameWriter」を参照してください。
Usage
次の例では 、Wanderbricks サンプル データセットを使用して、Spark DataFrame API と SQL を使用した Parquet ファイルの読み取りと書き込みを示します。
SQL を使用して Parquet ファイルを読み取る
テーブルを作成せずに SQL を使用してクラウド ストレージから直接 Parquet ファイルに対してクエリを実行するには、 read_files を使用します。
SELECT * FROM read_files(
'/Volumes/<catalog>/<schema>/<volume>/reviews_parquet',
format => 'parquet'
)
Parquet ファイルの読み取りと書き込み
次の例では、Wanderbricks レビューを Parquet 形式に書き込み、それらを DataFrame に読み取り、上書きモードを示します。
Python
# Write wanderbricks reviews to Parquet format
df = spark.read.table("samples.wanderbricks.reviews")
df.write.format("parquet").save("/Volumes/<catalog>/<schema>/<volume>/reviews_parquet")
# Read a Parquet file into a DataFrame
df = spark.read.format("parquet").load("/Volumes/<catalog>/<schema>/<volume>/reviews_parquet")
display(df)
# Write with overwrite mode
df.write.format("parquet").mode("overwrite").save("/Volumes/<catalog>/<schema>/<volume>/reviews_parquet")
Scala
// Write wanderbricks reviews to Parquet format
val reviews = spark.read.table("samples.wanderbricks.reviews")
reviews.write.format("parquet").save("/Volumes/<catalog>/<schema>/<volume>/reviews_parquet")
// Read a Parquet file into a DataFrame
val df = spark.read.format("parquet").load("/Volumes/<catalog>/<schema>/<volume>/reviews_parquet")
df.show()
// Write with overwrite mode
df.write.format("parquet").mode("overwrite").save("/Volumes/<catalog>/<schema>/<volume>/reviews_parquet")
SQL
-- Write wanderbricks reviews to Parquet format
CREATE TABLE reviews_parquet
USING PARQUET
AS SELECT * FROM samples.wanderbricks.reviews;
SELECT * FROM reviews_parquet;
スキーマを指定する
Parquet ファイルを読み取るときにスキーマを指定して、スキーマ推論のオーバーヘッドを回避します。 たとえば、 review_id、 rating、および comment フィールドを使用してスキーマを定義し、 reviews_parquet を DataFrame に読み取ります。
Python
from pyspark.sql.types import StructType, StructField, StringType, IntegerType
schema = StructType([
StructField("review_id", StringType(), True),
StructField("rating", IntegerType(), True),
StructField("comment", StringType(), True)
])
df = spark.read.format("parquet").schema(schema).load("/Volumes/<catalog>/<schema>/<volume>/reviews_parquet")
df.printSchema()
df.show()
Scala
import org.apache.spark.sql.types.{StructType, StructField, StringType, IntegerType}
val schema = StructType(Array(
StructField("review_id", StringType, nullable = true),
StructField("rating", IntegerType, nullable = true),
StructField("comment", StringType, nullable = true)
))
val df = spark.read.format("parquet").schema(schema).load("/Volumes/<catalog>/<schema>/<volume>/reviews_parquet")
df.printSchema()
df.show()
SQL
-- Create a table with an explicit schema from Parquet files
CREATE TABLE reviews_parquet (
review_id STRING,
rating INT,
comment STRING
)
USING PARQUET
OPTIONS (path "/Volumes/<catalog>/<schema>/<volume>/reviews_parquet");
SELECT * FROM reviews_parquet;
パーティション分割された Parquet ファイルを書き込む
パーティション分割された Parquet ファイルを書き込み、大規模なデータセットのクエリ パフォーマンスを最適化します。 たとえば、samples.wanderbricks.bookings を読み取り、check_in 列から派生した year と month でパーティション分割して bookings_parquet_partitioned に書き込みます。
Python
from pyspark.sql.functions import year, month
df = spark.read.table("samples.wanderbricks.bookings")
df_with_parts = df.withColumn("year", year("check_in")).withColumn("month", month("check_in"))
df_with_parts.write.format("parquet").partitionBy("year", "month").save("/Volumes/<catalog>/<schema>/<volume>/bookings_parquet_partitioned")
Scala
import org.apache.spark.sql.functions.{year, month}
val bookings = spark.read.table("samples.wanderbricks.bookings")
val bookingsWithParts = bookings.withColumn("year", year(col("check_in"))).withColumn("month", month(col("check_in")))
bookingsWithParts.write.format("parquet").partitionBy("year", "month").save("/Volumes/<catalog>/<schema>/<volume>/bookings_parquet_partitioned")
SQL
-- Write partitioned Parquet files by year and month
CREATE TABLE bookings_parquet_partitioned
USING PARQUET
PARTITIONED BY (year, month)
AS SELECT *, year(check_in) AS year, month(check_in) AS month
FROM samples.wanderbricks.bookings;
その他のリソース
- Azure Databricks の Delta Lake とは何ですか?: ACID トランザクション、スキーマの強制、またはタイム トラベルが必要で、さらに Parquet の列指向パフォーマンスも求める場合、Delta Lake は Azure Databricks に保存されるデータに推奨される形式です。