Интерактивный ORC File Viewer
Исследуем ORC-файл
В предыдущих уроках мы разобрали теорию: stripes, потоковая модель, индексы, система типов, ACID, шифрование. Теперь — практика. Ниже — интерактивный просмотрщик реального ORC-файла. Кликайте на элементы, чтобы раскрыть внутреннюю структуру.
Раскройте Stripe 0, затем Index Data — увидите min/max статистики и bloom filters по каждой колонке. Затем Column Streams — увидите потоки данных с кодировками и compression ratio. Stripe Footer показывает stream directory и column encodings.
Что показывает Viewer
Компонент отображает структуру ORC-файла с 4 уровнями вложенности:
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 level | Magic, version, schema, Footer |
| [i] Фиолетовый | Stripe | Offset, rows, section sizes |
| [~] Amber | Index Data | Min/max, count, bloom filters |
| [OK] Emerald | Column Streams | DATA, LENGTH, DICTIONARY, PRESENT |
| [!] Rose | Stripe Footer / Dictionary | Stream 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}")
Чтение по 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")
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")
events.orc
ORC-файл на диске. PyArrow читает PostScript → Footer → stripe data. Lazy reading: metadata загружаются при открытии, данные — при read().Создание 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}")
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 File Viewer показывает 4 уровня вложенности: File → Stripe → Index/Streams/Footer → отдельные entries
- PyArrow
orc.ORCFile— основной Python API для инспекции: metadata, stripe-level reading, column projection read_stripe(i, columns=[...])— два уровня pruning: горизонтальный (stripe) и вертикальный (column)- DuckDB поддерживает read-only через
read_orc()с SQL и predicate pushdown - Polars не имеет нативной ORC-поддержки — используйте PyArrow bridge
- Для production записи ORC с полным контролем параметров используйте Java ORC library, Hive или Spark