orcファイルのwrite.orc
Apache ORC は、大規模な分析ワークロードに最適化された列指向ファイル形式です。組み込みのインデックスと統計を使用して、読み取り時に関連性のないデータをスキップします。Databricksは、スキーマ指定、パーティショニング、書き込み圧縮など、Apache SparkでのORCの読み取りと書き込みの両方をサポートしています。
前提条件
Databricks は、ORC ファイルを使用するために、追加設定は不要です。ただし、ORCファイルをストリームするには、Auto Loaderが必要です。
オプション
ORCデータ ソースを構成するには、 DataFrameReaderとDataFrameWriterの.option()メソッドと.options()メソッドを使用します。 サポートされているオプションの完全なリストについては、 DataFrameReader ORC オプションとDataFrameWriter ORC オプションを参照してください。
使い方
以下の例では、Wanderbricks サンプルデータセットを使用し、Spark DataFrame API および SQL を使用した ORC ファイルの読み書き方法を実演します。
orcファイルのwrite.orc
- Python
- Scala
- SQL
# Write wanderbricks reviews to ORC format
df = spark.read.table("samples.wanderbricks.reviews")
df.write.format("orc").save("/Volumes/<catalog>/<schema>/<volume>/reviews_orc")
# Read an ORC file into a DataFrame
df = spark.read.format("orc").load("/Volumes/<catalog>/<schema>/<volume>/reviews_orc")
display(df)
# Write with overwrite mode
df.write.format("orc").mode("overwrite").save("/Volumes/<catalog>/<schema>/<volume>/reviews_orc")
// Write wanderbricks reviews to ORC format
val reviews = spark.read.table("samples.wanderbricks.reviews")
reviews.write.format("orc").save("/Volumes/<catalog>/<schema>/<volume>/reviews_orc")
// Read an ORC file into a DataFrame
val df = spark.read.format("orc").load("/Volumes/<catalog>/<schema>/<volume>/reviews_orc")
df.show()
// Write with overwrite mode
df.write.format("orc").mode("overwrite").save("/Volumes/<catalog>/<schema>/<volume>/reviews_orc")
-- Write wanderbricks reviews to ORC format
CREATE TABLE reviews_orc
USING ORC
AS SELECT * FROM samples.wanderbricks.reviews;
SELECT * FROM reviews_orc;
SQLを使用して.orcファイルをread.orc
read_files を使用すると、テーブルを作成せずに、SQL を使用してクラウド ストレージから ORC ファイルを直接クエリできます。
SELECT * FROM read_files(
'/Volumes/<catalog>/<schema>/<volume>/reviews_orc',
format => 'orc'
)
スキーマの指定
ORCファイルを読み取る際にスキーマを指定することで、スキーマ推論のオーバーヘッドを回避します。例えば、review_id、rating、comment のフィールドを持つスキーマを定義し、reviews_orc を DataFrame に読み込みます。
- Python
- Scala
- SQL
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("orc").schema(schema).load("/Volumes/<catalog>/<schema>/<volume>/reviews_orc")
df.printSchema()
df.show()
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("orc").schema(schema).load("/Volumes/<catalog>/<schema>/<volume>/reviews_orc")
df.printSchema()
df.show()
-- Create a table with an explicit schema from ORC files
CREATE TABLE reviews_orc (
review_id STRING,
rating INT,
comment STRING
)
USING ORC
OPTIONS (path "/Volumes/<catalog>/<schema>/<volume>/reviews_orc");
SELECT * FROM reviews_orc;
パーティション化されたORCファイルを書き込む
大規模データセットにおけるクエリパフォーマンスを最適化するために、パーティション分割されたORCファイルを作成します。たとえば、samples.wanderbricks.bookingsを読み込み、check_in列から派生したyearとmonthでパーティション化されたbookings_orc_partitionedに書き込みます。
- Python
- Scala
- SQL
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("orc").partitionBy("year", "month").save("/Volumes/<catalog>/<schema>/<volume>/bookings_orc_partitioned")
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("orc").partitionBy("year", "month").save("/Volumes/<catalog>/<schema>/<volume>/bookings_orc_partitioned")
-- Write partitioned ORC files by year and month
CREATE TABLE bookings_orc_partitioned
USING ORC
PARTITIONED BY (year, month)
AS SELECT *, year(check_in) AS year, month(check_in) AS month
FROM samples.wanderbricks.bookings;
その他のリソース
- Databricks における Delta Lake とは?:ORC を使用する Hive または Hadoop 環境から移行する場合は、Delta Lake が Databricks ネイティブの推奨フォーマットです。Parquetベースのストレージ上で、ACIDトランザクション、スキーマ強制、タイムトラベル、そして最適化された読み取りパフォーマンスを実現します。
- Parquet ファイルの読み取りと書き込み: ワークロードで Databricks 以外の最も幅広いエコシステム互換性が必要な場合、Parquet は、クエリエンジンやクラウドストレージツール全体で最も広くサポートされている列形式です。