Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Rust:Datenrahmen in Polaren aus mysql lesen

Dieselbe Antwort wie in dieser Frage , scheint meiner Meinung nach ziemlich doppelt zu sein.

Sie könnten dafür die Builder verwenden oder von Iteratoren sammeln. Das Sammeln von Iteratoren ist oft schnell, aber in diesem Fall müssen Sie den Vec<Country> durchlaufen zweimal, also sollten Sie einen Benchmark durchführen.

Nachfolgend finden Sie eine Beispielfunktion für beide gezeigten Lösungen.

use polars::prelude::*;

struct Country {
    country: String,
    count: i64,
}

fn example_1(values: &[Country]) -> (Series, Series) {
    let ca_country: Utf8Chunked = values.iter().map(|v| &*v.country).collect();
    let ca_count: NoNull<Int64Chunked> = values.iter().map(|v| v.count).collect();
    let mut s_country: Series = ca_country.into();
    let mut s_count: Series = ca_count.into_inner().into();
    s_country.rename("country");
    s_count.rename("country");
    (s_count, s_country)
}

fn example_2(values: &[Country]) -> (Series, Series) {
    let mut country_builder = Utf8ChunkedBuilder::new("country", values.len(), values.len() * 5);
    let mut count_builder = PrimitiveChunkedBuilder::<Int64Type>::new("count", values.len());

    values.iter().for_each(|v| {
        country_builder.append_value(&v.country);
        count_builder.append_value(v.count)
    });

    (
        count_builder.finish().into(),
        country_builder.finish().into(),
    )
}

Sobald Sie die Series haben , können Sie DataFrame::new(columns) verwenden wobei columns: Vec<Series> um einen DataFrame zu erstellen .

Übrigens, wenn Sie maximale Leistung wollen, empfehle ich wirklich connector-x . Es hat Polare und Pfeile integriert und hat eine wahnsinnige Leistung.