如何序列化apache箭头c ++表,通过套接字传输,并在python端反序列化
Posted
技术标签:
【中文标题】如何序列化apache箭头c ++表,通过套接字传输,并在python端反序列化【英文标题】:How to serialize apache arrow c++ table, trans through socket,and deserialize it at python side 【发布时间】:2021-03-03 06:09:57 【问题描述】:我是 apache arrow 新手,我的 C++ 项目使用 apache::table 来很好地存储数据。 现在,我需要将带有套接字的 c++ 表传输到其他 python 客户端。为什么要尝试这个,因为 python 客户端需要将数据转换为数据框,我注意到 python 中的箭头表可以使用 'to_pandas()' 来做到这一点。 我试图查找箭头 cython 代码,但一无所获。
【问题讨论】:
【参考方案1】:您可以通过基本套接字(下面的示例)发送箭头表,但最好使用 Flight。 Flight 使用 grpc 来回发送箭头数据,它将消除使用套接字的一些乏味。 Here 就是一个很好的例子。
完整的套接字示例可以在gist 中找到。
我会把相关的部分放在这里:
发送中
void SendTable(int socket_fd)
auto output_res = SocketOutputStream::Open(socket_fd);
if (!CheckErr(output_res.status(), "arrow::io::FileOutputStream"))
return;
auto output = *output_res;
arrow::MemoryPool *pool = arrow::default_memory_pool();
auto table = MakeTable();
if (table == nullptr)
return;
auto writer_res = arrow::ipc::MakeStreamWriter(output, table->schema());
if (!CheckErr(writer_res.status(), "arrow::ipc::MakeStreamWriter"))
return;
auto writer = *writer_res;
if (!CheckErr(writer->WriteTable(*table), "RecordBatchWriter::WriteTable"))
return;
CheckErr(writer->Close(), "RecordBatchWriter::Close");
接收
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
sock.bind((listen, port))
sock.listen()
print(f"Listening on listen on port port")
conn, _ = sock.accept()
with conn:
conn_file = conn.makefile(mode="b")
reader = pyarrow.ipc.RecordBatchStreamReader(conn_file)
table = reader.read_all()
print(table)
print(table.to_pandas())
【讨论】:
非常感谢。我尝试在我的项目中使用它,它很有用。 顺便说一句,在 C++ 中,我想转换几个具有不同标题的表,但在 python 中,'reader.read_all()' 函数一次读取所有表。我该怎么做才能一一阅读? 如果标题不同,您需要为每个表创建一个读取器/写入器。如果标题相同,您可以将其作为多个记录批次发送到同一读取器/写入器上。 在不同的 headers 条件下,我可以用同一个 socket 创建不同的 reader/writer 吗?我试图用相同的套接字在 C++ 中创建不同的编写器,但是在 python 中,如何使用相同的套接字使不同的读取器接收 Bathce 流以上是关于如何序列化apache箭头c ++表,通过套接字传输,并在python端反序列化的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Apache-Spark 2.x 中使用 java 进行增量序列
如何使用 BigQuery 和 Apache Beam 将 SQL 表转换为行序列列表?