微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何序列化apache箭头c++表,通过套接字传输,并在python端反序列化 发送接收

如何解决如何序列化apache箭头c++表,通过套接字传输,并在python端反序列化 发送接收

我是 apache arrow 的新手,我的 C++ 项目使用 apache::table 来很好地存储数据。 现在,我需要将带有套接字的 C++ 表传输到其他 python 客户端。为什么要尝试这个,因为python客户端需要将数据转换为数据框,我注意到python中的箭头表可以使用'to_pandas()'来做到这一点。 我试图查找箭头 cython 代码,但一无所获。

解决方法

可以通过基本套接字发送一个箭头表(下面的示例),但您最好使用 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())

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?