如何序列化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端反序列化的主要内容,如果未能解决你的问题,请参考以下文章

oracle中如何创建表的自增ID(通过序列)

如何在 Apache-Spark 2.x 中使用 java 进行增量序列

如何使用 BigQuery 和 Apache Beam 将 SQL 表转换为行序列列表?

如何通过iOS Objective C中的appDelegate从另一个视图控制器重新加载表视图

EXCEL两个表如何通过关联合并

Oracle 如何知道那个表用到哪个序列?急急急急急急急急急.....