Skip to main content

Batch mapping records into Apache Arrow tables and IPC streams for Python ETL pipelines.

Project description

http-to-arrow

http-to-arrow provides Arrow-backed containers for streaming HTTP and ETL-style ingestion workflows.

The package uses a standard source layout so code lives under src/http_to_arrow/src/http_to_arrow/ rather than the project root.

Package-specific tests currently live under tests/http_to_arrow/ at the monorepo root.

Included exports

  • ArrowRecordContainer
  • ArrowIPCStream
  • IPCStreamSink
  • UnknownFieldPolicy
  • MissingFieldPolicy
  • CoercionPolicy

Explicit schema

import pyarrow as pa

from http_to_arrow import ArrowRecordContainer

container = ArrowRecordContainer(
    schema=pa.schema([
        pa.field("id", pa.int64()),
        pa.field("name", pa.string()),
    ])
)

container.append({"id": 1, "name": "alpha"})

Inferred schema

from http_to_arrow import ArrowRecordContainer

container = ArrowRecordContainer(schema=None)

container.append({"ID": 1})
container.append({"id": 2, "name": "beta"})

table = container.to_table()
assert table.to_pydict() == {
    "ID": [1, 2],
    "name": [None, "beta"],
}

Notes

  • schema=None enables inferred mode.
  • Inferred mode widens as new fields appear and backfills older rows with nulls.
  • Conflicting inferred field types widen when possible and otherwise fall back to string.
  • to_table() raises when inferred mode has neither an explicit schema nor any appended records.

Materialization outputs

Use to_table() to materialize pending rows and batches as a cached PyArrow table. to_arrow() is a compatibility alias for the same table path.

Use to_polars_frame() to materialize the same data as a Polars DataFrame. to_polars() is a compatibility alias.

Batch access for streaming

Long-running streaming consumers can release completed batches without building one large table:

  • drain_batches() returns completed pending RecordBatch objects and clears them from the container.
  • iter_batches() yields completed batches in FIFO order and releases each one as it is yielded.
  • flush_partial() emits a trailing short batch from the in-flight accumulator and removes it from pending state so it is not materialized again later.

These helpers underpin ArrowIPCStream, which serializes completed batches to Arrow IPC bytes while keeping peak memory close to the active batch.

Memory tuning

For high-volume ingestion paths (for example streaming large HTTP responses into a single materialized Arrow table) the container exposes a few opt-in knobs to bound peak memory. All defaults preserve the historical behavior.

  • dictionary_encode=True (explicit schemas only): low-cardinality string and large_string columns are dictionary-encoded at flush time, producing dictionary-typed Arrow columns. Once a column is encoded, subsequent batches stay encoded so pa.Table.from_batches accepts them.
  • dictionary_cardinality_threshold (default 0.5): a column is only encoded when len(dictionary) / len(array) <= threshold on the first qualifying batch. Must be in [0.0, 1.0].
  • compact_on_materialize=True: runs pa.Table.combine_chunks() after materializing pending batches in to_table() or incremental_flush(), reducing the chunk fragmentation that builds up across many flushes.
  • eager_clear_accumulator=True: each accumulator column list is released as soon as its Arrow array is built during flush(). This is opt-in because it changes failure semantics: if a later column raises mid-flush the cleared earlier columns cannot be re-converted from the same in-flight rows.
  • For memory-constrained runtimes, lowering batch_size (default 128_000) reduces the size of the Python accumulator held between flushes at the cost of more frequent batch construction.

Streaming IPC

For memory-constrained runtimes (for example a 2 GiB Azure Function exporting millions of rows) you can stream completed batches out as Arrow IPC stream bytes instead of materializing one large table. ArrowIPCStream runs an async producer (such as HTTP pagination) and a consumer that serializes each completed RecordBatch to Arrow IPC bytes and releases it immediately, so peak memory stays close to a single batch. A bounded asyncio.Queue applies backpressure so the producer never outruns serialization.

Streaming requires an explicit schema because the IPC stream header is written before any rows arrive. Inferred-schema mode and dictionary_encode=True are rejected for streaming.

import pyarrow as pa

from http_to_arrow import ArrowIPCStream

schema = pa.schema([pa.field("id", pa.int64()), pa.field("name", pa.string())])

async def stream_rows():
    stream = ArrowIPCStream(schema=schema, batch_size=128_000, compression="zstd")

    async def produce() -> None:
        async for page in fetch_pages():  # your async paginator
            await stream.extend(page)

    async for chunk in stream.ipc_chunks(producer=produce):
        yield chunk  # forward each chunk to the streaming HTTP response

Consume the stream on the client with pyarrow.ipc.open_stream:

import pyarrow as pa

reader = pa.ipc.open_stream(pa.BufferReader(response_bytes))
table = reader.read_all()

For advanced composition, IPCStreamSink exposes the per-batch IPC serialization directly without the async orchestration.

The helper modules under http_to_arrow are private implementation details, including underscored modules and shared base classes. The public surface is ArrowRecordContainer, ArrowIPCStream, IPCStreamSink, and the three policy aliases exported from http_to_arrow.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

http_to_arrow-0.2.1.tar.gz (17.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

http_to_arrow-0.2.1-py3-none-any.whl (23.7 kB view details)

Uploaded Python 3

File details

Details for the file http_to_arrow-0.2.1.tar.gz.

File metadata

  • Download URL: http_to_arrow-0.2.1.tar.gz
  • Upload date:
  • Size: 17.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for http_to_arrow-0.2.1.tar.gz
Algorithm Hash digest
SHA256 99deed78e8175e62576697a91fcd2aa46e91e983d58cf40780e13aefff087a8e
MD5 3b9316bf3b28bf91ee1a41fd0a24981b
BLAKE2b-256 ba7f934c24e7eab6efc1cb59d40c204891dd9bf7eb0b85f205b1de835bb2d82d

See more details on using hashes here.

Provenance

The following attestation bundles were made for http_to_arrow-0.2.1.tar.gz:

Publisher: publish-http-to-arrow.yml on ProxayFox/proxay-pylibs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file http_to_arrow-0.2.1-py3-none-any.whl.

File metadata

  • Download URL: http_to_arrow-0.2.1-py3-none-any.whl
  • Upload date:
  • Size: 23.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for http_to_arrow-0.2.1-py3-none-any.whl
Algorithm Hash digest
SHA256 678c51aa8cb3e8f6e4da9b36f97213b29effb398d72f3948dd2764b24917971e
MD5 3ef9114b180c474bd00e688a6e2c53d0
BLAKE2b-256 9c7b1ffb2643c8f3f0e4ba2f35dac70452cc9915cddb49e027a4911886106bd9

See more details on using hashes here.

Provenance

The following attestation bundles were made for http_to_arrow-0.2.1-py3-none-any.whl:

Publisher: publish-http-to-arrow.yml on ProxayFox/proxay-pylibs

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page