Parquet ファイルの読み取りと書き込み

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_idrating、および 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 列から派生した yearmonth でパーティション分割して 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 に保存されるデータに推奨される形式です。