5

我想使用 Apache Arrow 将数据从 Django 后端发送到 Angular 前端。我想使用数据帧/表的字典作为消息中的有效负载。使用 pyarrow 在 python 微服务之间以这种方式共享数据是可能的,但我找不到使用箭头的 javascript 实现的方法。

有没有办法用箭头反序列化/序列化一个字典,其中字符串作为键,数据帧/表作为值在 JavaScript 端?

4

1 回答 1

3

是的,使用 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-b​​ody 响应存在什么功能,但如果您希望表连同其名称(或您希望包含的任何其他元数据)一起发送,这可能是制作响应的最佳方式.

在 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

于 2019-05-10T22:49:28.963 回答