簡體   English   中英

如何序列化apache箭頭c++表,通過socket,反序列化在python端

[英]How to serialize apache arrow c++ table, trans through socket,and deserialize it at python side

我是 apache 箭頭的新手,我的 C++ 項目使用 apache::table 來很好地存儲數據。 現在,我需要將帶有套接字的 c++ 表傳輸到其他 python 客戶端。 為什么要試試這個,因為 python 客戶端需要將數據轉換為 dataframe 並且我注意到 python 中的箭頭表可以使用 'to_pandas()' 來做到這一點。 我試圖查找箭頭 cython 代碼,但我一無所獲。

可以通過基本套接字(下面的示例)發送箭頭表,但最好使用 Flight。 Flight 使用 grpc 來回發送箭頭數據,它將消除使用 sockets 的一些乏味。 是一個很好的例子。

完整的套接字示例可以在這個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())

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM