ORC dosyalarını okuma ve yazma

Apache ORC , büyük ölçekli analitik iş yükleri için iyileştirilmiş sütunlu bir dosya biçimidir. Okuma sırasında ilgisiz verileri atlamak için yerleşik dizinleri ve istatistikleri kullanır. Azure Databricks şema belirtimi, bölümleme ve yazma sıkıştırması dahil olmak üzere Apache Spark ile hem okuma hem de yazma için ORC'yi destekler.

Önkoşullar

Azure Databricks, ORC dosyalarını kullanmak için ek yapılandırma gerektirmez. Ancak, ORC dosyalarının akışını yapmak için Otomatik Yükleyici gerekir.

Options

ORC veri kaynaklarını yapılandırmak için .option() ve .options() öğelerinin DataFrameReader ve DataFrameWriter yöntemlerini kullanın. Desteklenen seçeneklerin tam listesi için bkz DataFrameReader . ORC seçenekleri ve DataFrameWriter ORC seçenekleri.

Usage

Aşağıdaki örneklerde Spark DataFrame API'sini ve SQL'i kullanarak ORC dosyalarını okuma ve yazma işlemini göstermek için Wanderbricks örnek veri kümesi kullanılmıştır.

ORC dosyalarını okuma ve yazma

Python

# 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")

Scala

// 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")

SQL

-- Write wanderbricks reviews to ORC format
CREATE TABLE reviews_orc
USING ORC
AS SELECT * FROM samples.wanderbricks.reviews;

SELECT * FROM reviews_orc;

SQL kullanarak ORC dosyalarını okuma

Tablo oluşturmadan SQL kullanarak ORC dosyalarını doğrudan bulut depolamadan sorgulamak için kullanın read_files .

SELECT * FROM read_files(
  '/Volumes/<catalog>/<schema>/<volume>/reviews_orc',
  format => 'orc'
)

Şema belirtme

Şema çıkarımının ek yükünü önlemek için ORC dosyalarını okurken bir şema belirtin. Örneğin, review_id, rating ve comment alanlarına sahip bir şema tanımlayın ve reviews_orc öğesini bir DataFrame'e okuyun.

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("orc").schema(schema).load("/Volumes/<catalog>/<schema>/<volume>/reviews_orc")
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("orc").schema(schema).load("/Volumes/<catalog>/<schema>/<volume>/reviews_orc")
df.printSchema()
df.show()

SQL

-- 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;

Bölümlenmiş ORC dosyaları yazma

Büyük veri kümelerinde iyileştirilmiş sorgu performansı için bölümlenmiş ORC dosyaları yazın. Örneğin, check_in sütunundan türetilen year ve month ölçütlerine göre bölümlendirerek samples.wanderbricks.bookings öğesini okuyun ve bookings_orc_partitioned öğesine yazın.

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("orc").partitionBy("year", "month").save("/Volumes/<catalog>/<schema>/<volume>/bookings_orc_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("orc").partitionBy("year", "month").save("/Volumes/<catalog>/<schema>/<volume>/bookings_orc_partitioned")

SQL

-- 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;

Ek kaynaklar

  • Azure Databricks Delta Lake nedir?: ORC kullanarak bir Hive veya Hadoop ortamından geçiş gerçekleştiriyorsanız, Önerilen Databricks yerel biçimi Delta Lake'tir. Parquet tabanlı depolamaya ek olarak ACID işlem desteği, şema zorunluluğu, zaman yolculuğu ve optimize edilmiş okuma performansı sağlar.
  • Parquet dosyalarını okuma ve yazma: İş yükünüz Databricks dışında en geniş ekosistem uyumluluğu gerektiriyorsa Parquet, sorgu altyapıları ve bulut depolama araçları arasında en yaygın olarak desteklenen sütunlu biçimdir.