Arbeta med ORC-filer

Apache ORC är ett kolumnformat som ger optimeringar för att påskynda frågor. Det är effektivare än CSV eller JSON. Azure Databricks stöder ORC för både läsning och skrivning med Apache Spark. Mer information finns i Apache Spark-dokumentationen på ORC Files.

Förutsättningar

Azure Databricks kräver inte ytterligare konfiguration för att använda ORC-filer. Om du vill strömma ORC-filer behöver du dock Auto Loader.

Konfigurera och använda ORC med DataFrame API

Använd Apache Spark DataFrame API för att läsa och skriva ORC-filer när du behöver fullständig kontroll över schema-, partitionerings- eller skrivbeteende.

Läs- och skrivalternativ

Läs följande Apache Spark-referensartiklar för läs- och skrivalternativ för DataFrame API som stöds.

Läsa och skriva ORC-filer

Du kan till exempel läsa data.orc in i en DataFrame df och skriva den till orc_output.

Python

# Read an ORC file into a DataFrame
df = spark.read.format("orc").load("/tmp/data.orc")
df.show()

# Write a DataFrame to ORC format
df.write.format("orc").save("/tmp/orc_output")

# Write with overwrite mode
df.write.format("orc").mode("overwrite").save("/tmp/orc_output")

Scala

// Read an ORC file into a DataFrame
val df = spark.read.format("orc").load("/tmp/data.orc")
df.show()

// Write a DataFrame to ORC format
df.write.format("orc").save("/tmp/orc_output")

// Write with overwrite mode
df.write.format("orc").mode("overwrite").save("/tmp/orc_output")

SQL

-- Query ORC files directly
SELECT * FROM orc.`/tmp/data.orc`;

-- Create a table from ORC files
CREATE TABLE orc_table
USING ORC
OPTIONS (path "/tmp/data.orc");

SELECT * FROM orc_table;

Läsa ORC-filer med schemaspecifikation

Ange ett schema när du läser ORC-filer för att undvika omkostnaderna för schemainferens. Definiera till exempel ett schema med namefälten , ageoch city och läsa data.orc in i en DataFrame df.

Python

from pyspark.sql.types import StructType, StructField, StringType, IntegerType

schema = StructType([
    StructField("name", StringType(), True),
    StructField("age", IntegerType(), True),
    StructField("city", StringType(), True)
])

df = spark.read.format("orc").schema(schema).load("/tmp/data.orc")
df.printSchema()
df.show()

Scala

import org.apache.spark.sql.types.{StructType, StructField, StringType, IntegerType}

val schema = StructType(Array(
  StructField("name", StringType, nullable = true),
  StructField("age", IntegerType, nullable = true),
  StructField("city", StringType, nullable = true)
))

val df = spark.read.format("orc").schema(schema).load("/tmp/data.orc")
df.printSchema()
df.show()

SQL

-- Create a table with an explicit schema from ORC files
CREATE TABLE orc_table (
  name STRING,
  age INT,
  city STRING
)
USING ORC
OPTIONS (path "/tmp/data.orc");

SELECT * FROM orc_table;

Skriva partitionerade ORC-filer

Skriv partitionerade ORC-filer för optimerad frågeprestanda på stora datamängder. Skapa till exempel en DataFrame df med year, month, name och amount och skriv den till partitioned_orc partitionerad efter year och month.

Python

df = spark.createDataFrame(
    [
        (2023, 1, "Alice", 100),
        (2023, 1, "Bob", 200),
        (2023, 2, "Alice", 150),
        (2024, 1, "Alice", 300),
    ],
    ["year", "month", "name", "amount"]
)

# Write partitioned by year and month
df.write.format("orc").partitionBy("year", "month").save("/tmp/partitioned_orc")

Scala

val df = Seq(
  (2023, 1, "Alice", 100),
  (2023, 1, "Bob", 200),
  (2023, 2, "Alice", 150),
  (2024, 1, "Alice", 300)
).toDF("year", "month", "name", "amount")

// Write partitioned by year and month
df.write.format("orc").partitionBy("year", "month").save("/tmp/partitioned_orc")

SQL

-- Create a partitioned ORC table
CREATE TABLE partitioned_orc_table (
  name STRING,
  amount INT
)
USING ORC
PARTITIONED BY (year INT, month INT);

Läsa ORC-filer med SQL

Använd read_files för att fråga ORC-filer direkt från molnlagring med SQL utan att skapa en tabell. Fråga till exempel en ORC-fil som lagras i molnlagring med hjälp av sökvägen till filen och orc formatspecificeraren.

SELECT * FROM read_files(
  's3://<bucket>/<path>/<file>.orc',
  format => 'orc'
)

Ställ in ORC-komprimering

Konfigurera ORC-komprimering med hjälp av compression alternativet . Codecs som stöds är none, snappy, zliboch lzo. Skriv till exempel df till compressed_orc med zlib komprimering eller snappy_orc med snappy komprimering.

Python

# Write with zlib compression
df.write.format("orc").option("compression", "zlib").save("/tmp/compressed_orc")

# Write with snappy compression (default)
df.write.format("orc").option("compression", "snappy").save("/tmp/snappy_orc")

Scala

// Write with zlib compression
df.write.format("orc").option("compression", "zlib").save("/tmp/compressed_orc")

// Write with snappy compression (default)
df.write.format("orc").option("compression", "snappy").save("/tmp/snappy_orc")

SQL

-- Create an ORC table with zlib compression
CREATE TABLE compressed_orc_table (
  name STRING,
  age INT,
  city STRING
)
USING ORC
TBLPROPERTIES ('orc.compress' = 'ZLIB');

-- Create an ORC table with snappy compression
CREATE TABLE snappy_orc_table (
  name STRING,
  age INT,
  city STRING
)
USING ORC
TBLPROPERTIES ('orc.compress' = 'SNAPPY');