Шаги для воспроизведения:
Код C++:
Код: Выделить всё
arrow::Result DataFrame::toBinary(std::vector columns,
std::optional const &index,
std::unordered_map const& metadata) const {
columns = columns.empty() ? this->columnNames() : columns;
std::shared_ptr array = m_array;
if (index) {
array = array->AddColumn(array->num_columns(), arrow::field(*index, m_index->type()), m_index).MoveValueUnsafe();
}
std::shared_ptr output_stream;
ARROW_ASSIGN_OR_RAISE(output_stream, arrow::io::BufferOutputStream::Create());
// Create IPC writer
std::shared_ptr writer;
ARROW_ASSIGN_OR_RAISE(writer, arrow::ipc::MakeStreamWriter(output_stream.get(), array->schema()));
// Write the RecordBatch
ARROW_RETURN_NOT_OK(writer->WriteRecordBatch(*array, std::make_shared(metadata)));
// Finalize the writer
ARROW_RETURN_NOT_OK(writer->Close());
// Retrieve the buffer
std::shared_ptr buffer;
ARROW_ASSIGN_OR_RAISE(buffer, output_stream->Finish());
return buffer;
}
Код: Выделить всё
import pyarrow as pa
import pyarrow.ipc as ipc
buffer = pa.BufferReader(binary_data)
reader = ipc.open_stream(buffer)
table = reader.read_all()
data_frame = table.to_pandas()
print(data_frame.columns)
print(data_frame)
JavaScript Code:
const { tableFromIPC } = require('apache-arrow');
const table = tableFromIPC(binary_data);
Буфер IPC, сериализованный в C++, должен корректно десериализоваться как в Python, так и в JavaScript.
Фактическое поведение:
p>
- Python: десериализация работает правильно, и DataFrame печатается, как ожидалось.
Код: Выделить всё
Index(['o', 'h', 'l', 'c', 'v', 'vw', 'n', 'sma (c)|sma#00000', 'sma(c)|sma#00001', 't'], dtype='object') - JavaScript: десериализация завершается с ошибкой:
Код: Выделить всё
Error fetching market_data data: Error: Expected to read 131072 metadata bytes, but only read 120532.
- JavaScript:
Код: Выделить всё
Error fetching market_data data: Error: Expected to read 131072 metadata bytes, but only read 120532. readMetadata message.mjs:99 next message.mjs:48 readMessage message.mjs:57 _readNextMessageAndValidate reader.mjs:321 next reader.mjs:295 readAll reader.mjs:156 tableFromIPC serialization.mjs:29 transformModelData MarketDataProvider.tsx:38 fetchData GenericProvider.tsx:35
Код: Выделить всё
C++: Arrow version 14.0.1
Python: Arrow version 5
JavaScript: Arrow version 14.0.1, Node.js 14
- Схема таблицы включает следующие столбцы: ['o', 'h', ' l', 'c', 'v', 'vw', 'n', 'sma(c)|sma#00000', 'sma(c)|sma#00001' , 't'].
- Возможно, проблема связана с конфигурацией модуля записи IPC в коде C++.
- Может быть несоответствие в том, как версии Arrow обрабатывают потоки IPC между Python и JavaScript.
- Проверены сериализованные данные в Python, чтобы подтвердить правильность десериализации.
Проверили метаданные и размеры буфера в C++ и Python. - Убедились, что одна и та же версия Arrow используется в средах C++, Python и JavaScript.
- Проверено, что одна и та же версия Arrow используется в средах C++, Python и JavaScript.
li>
Компонент(ы)
C++, JavaScript, Python
Подробнее здесь: https://stackoverflow.com/questions/787 ... javascript