Learning Platform
Глоссарий Troubleshooting
Урок 04.07 · 20 мин
Средний
ORCORC File ViewerPyArroworc.ORCFileStripe InspectionInteractive

Интерактивный ORC File Viewer

Исследуем ORC-файл

В предыдущих уроках мы разобрали теорию: stripes, потоковая модель, индексы, система типов, ACID, шифрование. Теперь — практика. Ниже — интерактивный просмотрщик реального ORC-файла. Кликайте на элементы, чтобы раскрыть внутреннюю структуру.

Интерактивный ORC File Viewer
ORCMagic number (3 байта: 0x4F 0x52 0x43)
File:version:v0.12rows:150,000stripes:2compression:ZSTDblock:256.0 KBstride:10,000 rowssize:5.6 MB
schema:event_id: BIGINTuser_name: STRINGamount: DECIMAL(18,2)created_at: TIMESTAMP
Footer (Protobuf)offset:0x5A0D03length:2.0 KB
Type tree + stripe information + file statistics + user metadata
File Metadata (Protobuf)length:512 B
Stripe-level column statistics (опциональная секция)
PostScript (не сжат)length:24 Bmagic:"ORC"compression:ZSTDversion:[0, 12]
PostScript Length: 24 (последний 1 байт файла)
Кликните для раскрытия:● Stripe● Index Data● Column Streams● Stripe Footer
TIP

Раскройте Stripe 0, затем Index Data — увидите min/max статистики и bloom filters по каждой колонке. Затем Column Streams — увидите потоки данных с кодировками и compression ratio. Stripe Footer показывает stream directory и column encodings.

Что показывает Viewer

Компонент отображает структуру ORC-файла с 4 уровнями вложенности:

Уровни навигации в ORC File Viewer

File Level — magic, version, schema, size

Верхний уровень: magic number 'ORC', version, total rows, compression codec, compression block size, row index stride, schema (type tree), file size.

Stripe Level — offset, rows, section sizes

Кликабельные stripes: offset, numRows, размеры секций (index, data, footer). Каждая stripe раскрывается в три вложенные секции.

Index Data

Index Data: per-column min/max/count/nullCount + наличие bloom filter. Эквивалент Row Index из урока 03.

Column Streams

Column Streams: каждый stream с columnId, kind (DATA, LENGTH, DICTIONARY_DATA, PRESENT, SECONDARY), encoding, compressed/uncompressed sizes, compression ratio.

Stripe Footer

Stripe Footer: stream directory (перечень всех streams) и column encodings. Карта навигации внутри stripe.

Footer + Metadata + PostScript

Нижний уровень файла: Footer (Protobuf — type tree, stripe info, file stats), File Metadata (stripe-level stats), PostScript (bootstrap, не сжат), последний байт — длина PostScript.

Цветовая схема

ЦветЭлементЧто содержит
[i] СинийFile levelMagic, version, schema, Footer
[i] ФиолетовыйStripeOffset, rows, section sizes
[~] AmberIndex DataMin/max, count, bloom filters
[OK] EmeraldColumn StreamsDATA, LENGTH, DICTIONARY, PRESENT
[!] RoseStripe Footer / DictionaryStream directory, encodings

PyArrow: инспекция ORC-файлов

PyArrow предоставляет API для чтения ORC через модуль pyarrow.orc. Это основной Python-инструмент для инспекции ORC-файлов.

Открытие файла

import pyarrow.orc as orc

# Открыть ORC-файл
orcfile = orc.ORCFile('events.orc')

# Базовые метаданные
print(f"Rows: {orcfile.nrows}")
print(f"Stripes: {orcfile.nstripes}")
print(f"Schema: {orcfile.schema}")
print(f"Compression: {orcfile.compression}")
print(f"Compression size: {orcfile.compression_size}")
print(f"Row index stride: {orcfile.row_index_stride}")
print(f"Writer: {orcfile.writer}")
print(f"Writer version: {orcfile.writer_version}")
print(f"File version: {orcfile.format_version}")
Свойства ORCFile
orcfile.nrowsОбщее количество строк в файле. Читается из Footer.numberOfRows без сканирования данных.
orcfile.nstripesКоличество stripes. Из Footer.stripes.length. Определяет максимальный параллелизм чтения.
orcfile.schemaPyArrow Schema — конвертированная из ORC type tree. Типы ORC маппятся в Arrow типы: BIGINT → int64, STRING → string, TIMESTAMP → timestamp[ns].
orcfile.compressionКодек компрессии из PostScript: ZLIB, SNAPPY, LZ4, ZSTD, NONE. Один кодек на весь файл.
orcfile.compression_sizeРазмер блока компрессии (compressionBlockSize из PostScript). Default: 262144 (256 KB). Определяет granularity сжатия.
orcfile.row_index_strideИнтервал Row Index: каждые N строк создаётся index entry с min/max/count. Default: 10000. Из Footer.rowIndexStride.

Чтение по stripe

# Чтение конкретной stripe
stripe_table = orcfile.read_stripe(0)
print(f"Stripe 0: {stripe_table.num_rows} rows, {stripe_table.num_columns} columns")

# Чтение конкретных колонок из stripe
stripe_cols = orcfile.read_stripe(0, columns=['event_id', 'amount'])
print(stripe_cols.to_pandas().head())

# Итерация по всем stripes
for i in range(orcfile.nstripes):
 stripe = orcfile.read_stripe(i)
 print(f"Stripe {i}: {stripe.num_rows} rows")
NOTE

read_stripe(i) читает только указанную stripe, а read_stripe(i, columns=[...]) применяет column projection — читает только нужные колонки. Это два уровня pruning: horizontal (stripe) + vertical (column). PyArrow использует native ORC C++ reader — чтение быстрое.

Полное чтение файла

# Чтение всего файла в Arrow Table
table = orcfile.read()
print(f"Total: {table.num_rows} rows")

# С column projection
table = orcfile.read(columns=['event_id', 'created_at'])

# Конвертация в Pandas
df = table.to_pandas()
print(df.describe())

Метаданные stripe

# Stripe-level метаданные
for i in range(orcfile.nstripes):
 metadata = orcfile.read_stripe_metadata(i) if hasattr(orcfile, 'read_stripe_metadata') else None
 stripe = orcfile.read_stripe(i)
 print(f"Stripe {i}: {stripe.num_rows} rows, "
 f"{stripe.nbytes} bytes")
Путь данных: ORC → PyArrow → Pandas

events.orc

ORC-файл на диске. PyArrow читает PostScript → Footer → stripe data. Lazy reading: metadata загружаются при открытии, данные — при read().
orc.ORCFile()PyArrow ORC Reader (C++): декомпрессия, декодирование RLEv2/Dictionary, конвертация ORC types в Arrow types. Zero-copy где возможно.
Arrow TableArrow Table — колоночная структура в памяти. Chunked arrays, zero-copy slicing. Промежуточное представление перед конвертацией в Pandas/Polars.
df.to_pandas()Pandas DataFrame через .to_pandas(). Для больших файлов рекомендуется работать с Arrow Table напрямую — меньше копий памяти.

Создание ORC-файла через PyArrow

import pyarrow as pa
import pyarrow.orc as orc

# Создаём Arrow Table
table = pa.table({
 'event_id': pa.array([1, 2, 3, 4, 5], type=pa.int64()),
 'user_name': pa.array(['alice', 'bob', 'charlie', None, 'eve']),
 'amount': pa.array([99.50, 150.00, 75.25, 200.00, 50.00]),
 'created_at': pa.array([
 '2025-01-15', '2025-02-20', '2025-03-10',
 '2025-04-05', '2025-05-22',
 ], type=pa.string()).cast(pa.timestamp('us')),
})

# Записываем в ORC
orc.write_table(table, 'output.orc', compression='ZSTD')

# Проверяем результат
result = orc.ORCFile('output.orc')
print(f"Written: {result.nrows} rows, {result.nstripes} stripes")
print(f"Compression: {result.compression}")
print(f"Schema: {result.schema}")
WARNING

PyArrow ORC writer поддерживает ограниченный набор опций по сравнению с Java ORC library. Нельзя задать stripe size, row index stride, bloom filter columns, encryption. Для production workloads используйте Hive или Spark для записи ORC-файлов с полным контролем параметров.

DuckDB: чтение ORC

DuckDB поддерживает чтение ORC-файлов (read-only):

-- Чтение ORC в DuckDB
SELECT * FROM read_orc('events.orc') LIMIT 10;

-- Агрегация
SELECT user_name, SUM(amount) as total
FROM read_orc('events.orc')
GROUP BY user_name
ORDER BY total DESC;

-- Predicate pushdown
SELECT * FROM read_orc('events.orc')
WHERE event_id BETWEEN 100 AND 200;
Поддержка ORC в Python-экосистеме
PyArrowПолная поддержка: read, write, stripe-level access, column projection, schema inspection. C++ native reader. Основной инструмент.
DuckDBRead-only через read_orc(). SQL-интерфейс, predicate pushdown, parallel scan. Не поддерживает запись.
PolarsНет нативной поддержки ORC. Можно читать через PyArrow: pl.from_arrow(orc.ORCFile('f.orc').read()). Нет direct read_orc().

Ключевые выводы

  1. ORC File Viewer показывает 4 уровня вложенности: File → Stripe → Index/Streams/Footer → отдельные entries
  2. PyArrow orc.ORCFile — основной Python API для инспекции: metadata, stripe-level reading, column projection
  3. read_stripe(i, columns=[...]) — два уровня pruning: горизонтальный (stripe) и вертикальный (column)
  4. DuckDB поддерживает read-only через read_orc() с SQL и predicate pushdown
  5. Polars не имеет нативной ORC-поддержки — используйте PyArrow bridge
  6. Для production записи ORC с полным контролем параметров используйте Java ORC library, Hive или Spark

Проверьте понимание

Результат: 0 из 0
Концептуальный
Вопрос 1 из 4. pyarrow.orc.ORCFile(path). Как получить количество stripes и общее число строк без чтения данных?

Закончили урок?

Отметьте его как пройденный, чтобы отслеживать свой прогресс

Войдите чтобы оценить урок

Прогресс модуля
0 из 7