我想使用 Apache Arrow 将数据从 Django 后端发送到 Angular 前端。我想使用数据帧/表的字典作为消息中的有效负载。使用 pyarrow 在 python 微服务之间以这种方式共享数据是可能的,但我找不到使用箭头的 javascript 实现的方法。
有没有办法用箭头反序列化/序列化一个字典,其中字符串作为键,数据帧/表作为值在 JavaScript 端?
我想使用 Apache Arrow 将数据从 Django 后端发送到 Angular 前端。我想使用数据帧/表的字典作为消息中的有效负载。使用 pyarrow 在 python 微服务之间以这种方式共享数据是可能的,但我找不到使用箭头的 javascript 实现的方法。
有没有办法用箭头反序列化/序列化一个字典,其中字符串作为键,数据帧/表作为值在 JavaScript 端?
是的,使用 pyarrow 和 ArrowJS 中的 RecordBatchReader 和 RecordBatchWriter IPC 原语可以实现这种变体。
在 python 方面,您可以像这样将 Table 序列化为缓冲区:
import pyarrow as pa
def serialize_table(table):
sink = pa.BufferOutputStream()
writer = pa.RecordBatchStreamWriter(sink, table.schema)
writer.write_table(table)
writer.close()
return sink.getvalue().to_pybytes()
# ...later, in your route handler:
bytes = serialize_table(create_your_arrow_table())
然后您可以在响应正文中发送字节。如果您有多个表,则可以将每个表中的缓冲区连接为一个大负载。
我不确定在 python 中编写 multipart/form-body 响应存在什么功能,但如果您希望表连同其名称(或您希望包含的任何其他元数据)一起发送,这可能是制作响应的最佳方式.
在 JavaScript 方面,您可以使用Table.from()
(如果您只有一个表)或RecordBatchReader
如果您有多个表,或者如果您想以流方式读取每个 RecordBatch 来读取响应:
import { Table, RecordBatchReader } from 'apache-arrow'
// easy if you want to read the first (or only) table in the response
const table = await Table.from(fetch('/table'))
// or for mutliple tables on the same stream, or to read in a streaming fashion:
for await (const reader of RecordBatchReader.readAll(fetch('/table'))) {
// Buffer all batches into a table
const table = await Table.from(reader)
// Or process each batch as it's downloaded
for await (const batch of reader) {
}
}
您可以在此处的 ArrowJS 测试中看到更多示例: https ://github.com/apache/arrow/blob/3eb07b7ed173e2ecf41d689b0780dd103df63a00/js/test/unit/ipc/writer/stream-writer-tests.ts#L40
您还可以在我为在节点中使用和生成 Arrow 有效负载而编写的一个小 fastify 插件中看到一些示例:https ://github.com/trxcllnt/fastify-arrow