Чтение и запись ФАЙЛОВ ORC

Apache ORC — это формат столбцов, оптимизированный для крупномасштабных аналитических рабочих нагрузок. Он использует встроенные индексы и статистику для пропуска неуместных данных во время чтения. Azure Databricks поддерживает ORC для чтения и записи с помощью Apache Spark, включая спецификацию схемы, секционирование и сжатие записи.

Необходимые условия

Azure Databricks не требует дополнительной настройки для использования файлов ORC. Однако для потоковой передачи файлов ORC требуется автозагрузчик.

Options

Используйте методы .option() и .options() классов DataFrameReader и DataFrameWriter для настройки источников данных ORC. Полный список поддерживаемых параметров см. в разделе DataFrameReader "Параметры ORC " и DataFrameWriter "Параметры ORC".

Usage

В следующих примерах используется образец набора данных Wanderbricks для демонстрации чтения и записи ФАЙЛОВ ORC с помощью API и SQL Spark DataFrame.

Чтение и запись ФАЙЛОВ ORC

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;

Чтение ФАЙЛОВ ORC с помощью SQL

Используется read_files для запроса файлов ORC непосредственно из облачного хранилища с помощью SQL без создания таблицы.

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

Указание схемы

Укажите схему при чтении файлов ORC, чтобы избежать затрат на вывод схемы. Например, определите схему с полями review_id, rating и comment и считайте reviews_orc в 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("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;

Запись секционированных ФАЙЛОВ ORC

Запись секционированных ФАЙЛОВ ORC для оптимизации производительности запросов на большие наборы данных. Например, прочитать samples.wanderbricks.bookings и записать его в bookings_orc_partitioned с разбиением по year и month, полученным из столбца check_in.

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.{col, month, year}

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;

Дополнительные ресурсы

  • Что такое Delta Lake в Azure Databricks?: Если вы переходите из среды Hive или Hadoop, использующей ORC, Delta Lake — это рекомендуемый собственный формат Databricks. Он добавляет транзакции ACID, контроль схемы, доступ к предыдущим версиям данных и оптимизированную скорость чтения поверх хранилища на базе Parquet.
  • Чтение и запись файлов Parquet. Если для рабочей нагрузки требуется самая широкая совместимость экосистемы за пределами Databricks, Parquet является наиболее широко поддерживаемым форматом столбцов в обработчиках запросов и средствах облачного хранилища.