Learning Platform
Глоссарий Troubleshooting
Урок 02.05 · 12 мин
Средний
Arrow Ecosystemarrow-rsPyArrowADBCnanoarrowCross-Language

Экосистема Arrow: реализации, ADBC и cross-language мир

Одна спецификация — множество реализаций

Apache Arrow — это спецификация, а не библиотека. Byte layout определён раз и навсегда; каждый язык реализует работу с этим layout самостоятельно. С 2024 года языковые реализации живут в отдельных репозиториях:

РеализацияЯзыкРепозиторийВерсия (март 2026)
arrow-rsRustapache/arrow-rs55.x (отдельная нумерация)
PyArrowPython (C++ backend)apache/arrow23.0.1
Arrow C++C++apache/arrow23.0.1
Arrow JavaJavaapache/arrow-javaотдельная нумерация
Arrow GoGoapache/arrow-goотдельная нумерация
Arrow JuliaJuliaapache/arrow-juliaотдельная нумерация
NOTE

Версия 23.0.1 — это версия основного apache/arrow репозитория (C++, Python, R, C#, JavaScript). Rust-реализация arrow-rs имеет собственную нумерацию и выпускается каждые 2 недели. DataFusion зависит от arrow-rs, а не от основного Arrow.

arrow-rs: Rust-реализация

arrow-rs — основная зависимость DataFusion. Это чистая Rust-реализация без FFI-вызовов в C++. Ключевые crates:

Структура arrow-rs crates
arrowЗонтичный crate — реэкспортирует все под-crate для удобного импорта
arrow-arrayТипизированные массивы: Int32Array, StringArray, RecordBatch и другие
arrow-bufferНизкоуровневые буферы: Buffer, MutableBuffer с alignment по 64 байт
arrow-schemaОпределение структуры данных: Schema, Field, DataType, metadata
arrow-selectОперации выбора: filter, take, concat — работа с подмножествами массивов
arrow-computeВычислительные ядра: cast, math, сравнения — SIMD-оптимизированные операции
arrow-ipcЧтение и запись Arrow IPC формата: stream и file с zero-copy
arrow-csvПарсинг и запись CSV файлов с автоматическим определением типов
arrow-jsonЧтение и запись JSON/NDJSON в Arrow формат
arrow-flightgRPC-транспорт для передачи Arrow данных по сети
parquetЧтение и запись Parquet: row group pruning, predicate pushdown, compression

Модульная структура позволяет зависеть только от нужных crates. DataFusion использует arrow-array, arrow-schema, arrow-select, arrow-compute и parquet — но не arrow-csv или arrow-json напрямую.

Отличия arrow-rs от Arrow C++

Аспектarrow-rsArrow C++
Memory safetyГарантирована Rust borrow checkerРучное управление, ASAN в тестах
Release cycleКаждые 2 неделиКаждые 3 месяца (с C++/Python)
Async I/OНативный (tokio)callback-based
SIMDАвто-векторизация LLVMЯвные интринсики + авто
ЗависимостиМинимальные (чистый Rust)Тяжёлые (CMake, Boost, gRPC, protobuf)

PyArrow: Python-мост

PyArrow — Python-обёртка над Arrow C++ реализацией. Это основной способ работы с Arrow в Python:

import pyarrow as pa

# Создание таблицы
table = pa.table({
    "id": [1, 2, 3],
    "name": ["Иван", "Мария", "Пётр"],
    "salary": [80000, 95000, None],
})

# Конвертация в Pandas (zero-copy для числовых колонок)
df = table.to_pandas()

# Чтение Parquet (через Arrow C++ Parquet reader)
table = pa.parquet.read_table("data.parquet")

PyArrow интегрируется с:

  • Pandasto_pandas() / from_pandas() (ArrowDtype в Pandas 2.0+)
  • Polars — нативный Arrow backend, zero-copy обмен с PyArrow
  • DuckDB — прямой обмен Arrow-буферами без копирования
  • DataFusion Python — Python-биндинги DataFusion работают с PyArrow таблицами
TIP

DataFusion Python (datafusion pip package) принимает PyArrow таблицы на вход и возвращает PyArrow на выход. Переход между DataFusion и Pandas/Polars — одна строка кода через PyArrow как промежуточный формат.

Arrow Java: JVM-мир

Arrow Java — отдельный репозиторий (apache/arrow-java). Основные потребители:

  • Apache Spark — использует Arrow для обмена данных с Python (PySpark toPandas()), Spark Connect
  • Apache Flink — Arrow для Python UDF
  • Dremio — Arrow-нативный query engine на JVM

Arrow Java использует off-heap память (DirectByteBuffer), что позволяет избежать GC-пауз при обработке больших объёмов данных. Однако это требует явного управления lifecycle буферов (allocator.close()).

ADBC: Arrow Database Connectivity

ADBC (Arrow Database Connectivity) — новый стандарт интерфейса к базам данных, проектированный вокруг Arrow:

ADBC vs JDBC/ODBC
JDBC / ODBCТрадиционные интерфейсы: row-oriented результат, требуется конвертация в Arrow на стороне клиента
ADBCНовый стандарт: результат — сразу Arrow RecordBatch, без промежуточной конвертации

ADBC определяет C API, который драйверы реализуют. Доступны драйверы для PostgreSQL, SQLite, Flight SQL и DuckDB. Python-пакет adbc-driver-* позволяет получать результаты запросов сразу как PyArrow таблицы.

import adbc_driver_postgresql.dbapi

# ADBC: результат — сразу Arrow, без промежуточного ResultSet
with adbc_driver_postgresql.dbapi.connect("postgresql://...") as conn:
    with conn.cursor() as cur:
        cur.execute("SELECT * FROM events")
        table = cur.fetch_arrow_table()  # PyArrow Table напрямую

nanoarrow: минимальная реализация

nanoarrow — облегчённая C-библиотека для чтения/записи Arrow-данных. Нет зависимостей, ~100 KB кода. Предназначена для встраиваемых систем и языковых биндингов, где полный Arrow C++ слишком тяжёл.

nanoarrow реализует:

  • Arrow C Data Interface (обмен данными между языками через C ABI)
  • Arrow C Stream Interface (потоковый обмен)
  • Базовые операции создания и чтения массивов

Используется как FFI-мост: Python-расширение на C может получить Arrow-данные из PyArrow через C Data Interface, обработать через nanoarrow и вернуть результат без копирования.

DataFusion в экосистеме Arrow

DataFusion занимает уникальную позицию: это не просто потребитель Arrow, а query engine, построенный на Arrow с первого дня.

DataFusion в Arrow экосистеме
Python (PyArrow)Python: DataFusion Python + PyArrow. SQL и DataFrame API
Rust (arrow-rs)Rust: нативный API. SessionContext, DataFrame, LogicalPlan
DataFusion Query EngineArrow-native движок: каждый оператор принимает и возвращает RecordBatch без промежуточных форматов
Parquet (arrow-rs)Нативное чтение и запись Parquet через arrow-rs: row group pruning, predicate pushdown
CSV / JSONПоддержка текстовых форматов для импорта и экспорта данных
Arrow IPC / FlightIPC для локальной передачи, Flight для сетевой — оба без сериализации

Каждый оператор DataFusion принимает RecordBatch и возвращает RecordBatch. Нет промежуточных форматов, нет конвертации. Вычислительные ядра (arrow-compute) используются напрямую для filter, cast, math операций.

Это даёт DataFusion преимущество перед движками, которые добавляли Arrow-поддержку позже (Spark, Presto): нет legacy-слоёв конвертации.

Итоги

  • Arrow — спецификация; arrow-rs, PyArrow, Arrow Java — реализации
  • arrow-rs — чистая Rust-реализация, основная зависимость DataFusion
  • PyArrow — мост между Arrow и Python-экосистемой (Pandas, Polars, DuckDB)
  • ADBC — новый стандарт доступа к БД с нативным Arrow, замена JDBC/ODBC
  • nanoarrow — минимальная C-реализация для FFI и встраиваемых систем
  • DataFusion — Arrow-native query engine без legacy-слоёв конвертации

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

Результат: 0 из 0
Концептуальный
Вопрос 1 из 5. Какая реализация Arrow является основной зависимостью DataFusion?

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

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

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

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