一、文件准备
样本内容,N行9列的csv标准格式,有字符串,有浮点数,有整型。
有两个csv文件,一个大约是2.1万行;一个是64万行。
二、toml文件
[package]
name = "my_duckdb"
version = "0.1.0"
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
duckdb = { version = "0.10.2", features = ["bundled"] }
polars = {version ="0.39.0"}
三、main.rs
use duckdb::{
arrow::{record_batch::RecordBatch, util::pretty::print_batches},
Connection, Result,
};
use polars::prelude::*;
use std::time::{Instant};
fn main() {
//test.csv:2w行;test2.csv:64w行
let csvs = ["test.csv","test2.csv"];
for csv in csvs{
duckdb_read_csv(csv).unwrap();
polars_read_csv(csv);
}
}
fn duckdb_read_csv(filepath:&str) ->Result<()> {
let duckdb_csv_time = Instant::now();
let db = Connection::open_in_memory()?;
let sql_format = format!("SELECT * from read_csv('{}');",filepath);
let rbs: Vec<RecordBatch> = db
.prepare(&sql_format)?
.query_arrow([])?
.collect();
//print_batches(&rbs).unwrap();// 批量打印
assert!(rbs.len()>0);
println!("duckdb取出的行数:{:?} 列数:{:?}",rbs[0].num_rows(),rbs[0].num_columns());
println!("duckdb 读csv花时: {:?} 秒!", duckdb_csv_time.elapsed().as_secs_f32());
let _ = db.close();
Ok(())
}
fn polars_read_csv(filepath:&str){
let polars_csv_time = Instant::now();
let df = CsvReader::from_path(filepath)
.unwrap()
.has_header(true)
.finish()
.unwrap();
println!("polars读出csv的行和列数:{:?}",df.shape());
println!("polars 读csv 花时: {:?} 秒!", polars_csv_time.elapsed().as_secs_f32());
}
四、输出
-----------"test.csv"-------------
duckdb取出的行数:2048 列数:9
duckdb 读csv花时: 0.032244585 秒!
polars读出csv的行和列数:(21357, 9)
polars 读csv 花时: 0.006511025 秒!
-----------"test.csv"-------------
-----------"test2.csv"-------------
duckdb取出的行数:2048 列数:9
duckdb 读csv花时: 0.1279175 秒!
polars读出csv的行和列数:(640710, 9)
polars 读csv 花时: 0.02369589 秒!
-----------"test2.csv"-------------
duckdb和polars读文件共花:0.19441628秒!
结论:从上面的样本来看,分别用duckdb和polars来读csv两个不同大小的文件,polars有优势。当然,也可能是duckdb库封装的问题,也可能是文件大小不同,测试代表性还不全。谨供参考!
五、问题
从输出可以明显看出,duckdb库读出来的num_rows是有问题的。这个问题还待查实。从print_batches(&rbs).unwrap(),打印出来的内容来看,并没有少。