Soy nuevo en apache arrow, mi proyecto de C ++ usa apache :: table para almacenar bien los datos. y ahora, necesito transferir la tabla c ++ con socket a otro cliente de Python. ¿Por qué intentar esto? Porque el cliente de Python necesita convertir los datos en un marco de datos y me doy cuenta de que la tabla de flechas en Python puede usar 'to_pandas ()' para hacer eso. Intenté buscar el código cython de flecha hacia arriba, pero no encontré nada.

0
jerryxu 3 mar. 2021 a las 09:09

1 respuesta

La mejor respuesta

podría enviar una tabla de flechas a través de un conector básico (ejemplo a continuación), pero probablemente sea mejor usar Flight. Flight usa grpc para enviar datos de flechas de un lado a otro y eliminará parte del tedio de usar sockets. Aquí hay un gran ejemplo.

El ejemplo de socket completo se puede encontrar en esta gist.

Pondré los bits relevantes aquí:

Enviando

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");
}

Recepción

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())
0
Pace 3 mar. 2021 a las 19:37