Как десериализовать RecordBatch из буфера пиарроу - PullRequest
0 голосов
/ 17 октября 2019

Моя цель - сериализовать RecordBatch, отправить его по каналу веб-сокета и десериализовать его на стороне получателя.

На стороне получателя, после получения пакета данных и восстановления объекта pyarrow.lib.Bufferс pa.py_buffer я не могу десериализовать его обратно в RecordBatch.

Не указывать в шаблоне websocket этот фрагмент кода, который обобщает то, что я пытаюсь сделать:

import pyarrow as pa

indicators = [(1, 'A'), (2, 'B')]

id = pa.int16()
name = pa.string()

data = pa.array(indicators, type=pa.struct([('id', id), ('name', name)]))

batch = pa.RecordBatch.from_arrays([data], ['indicators'])

buffer = batch.serialize()

# How to get back a RecordBatch from buffer?
#
# ???

1 Ответ

1 голос
/ 18 октября 2019

При использовании такого метода serialize вы можете использовать функцию read_record_batch с заданной известной схемой:

>>> pa.ipc.read_record_batch(buffer, batch.schema)
<pyarrow.lib.RecordBatch at 0x7ff412257278>

Но это означает, что вам нужно знать схемуна принимающей стороне. Чтобы инкапсулировать это в сериализованные данные, используйте RecordBatchStreamWriter вместо:

>>> sink = pa.BufferOutputStream()
>>> writer = pa.RecordBatchStreamWriter(sink, batch.schema)
>>> writer.write_batch(batch)
>>> writer.close()
>>> buf = sink.getvalue()
>>> reader = pa.ipc.open_stream(buf)
>>> reader.read_all()
pyarrow.Table
indicators: struct<id: int16, name: string>
  child 0, id: int16
  child 1, name: string

См. Документы в https://arrow.apache.org/docs/python/ipc.html

...