#sqlite #parquet #generate #lets

bin+lib sqlite2parquet

从 sqlite 数据库生成 parquet 文件

12 个版本 (重大更新)

0.10.2 2023年9月22日
0.10.1 2022年11月23日
0.10.0 2022年8月2日
0.9.0 2022年5月31日
0.5.0 2022年3月1日

#578数据库接口

Download history 473/week @ 2024-03-31 367/week @ 2024-04-07 556/week @ 2024-04-14 327/week @ 2024-04-21 414/week @ 2024-04-28 443/week @ 2024-05-05 577/week @ 2024-05-12 597/week @ 2024-05-19 601/week @ 2024-05-26 446/week @ 2024-06-02 558/week @ 2024-06-09 716/week @ 2024-06-16 513/week @ 2024-06-23 682/week @ 2024-06-30 718/week @ 2024-07-07 498/week @ 2024-07-14

每月下载量 2,411

无许可证

38KB
770

sqlite2parquet

sqlite2parquet 允许您从 sqlite 数据库生成 parquet 文件。它作为库和 CLI 应用程序提供;它们具有相同的功能,因此请使用最方便的。有关将 sqlite 数据库归档为 parquet 文件的说明,请参阅 此处。代码属于公共领域。

CLI 应用程序

按照这种方式安装它

$ cargo install sqlite2parquet

如果您直接使用库,您可能想要删除与 CLI 相关的依赖项,因此请在您的 Cargo.toml 中设置 default-features = false


lib.rs:

从 sqlite 数据库生成 parquet 文件

本库提供以下两项功能

  1. 一种灵活的方法,可以从一组 SQL 语句生成 parquet 文件
  2. 一种生成将整个表写入 parquet 文件所需配置的方法

本包还包含一个二进制 crate,允许您轻松地将整个 sqlite DB 压缩成多个 parquet 文件。这通常比 xz 具有更好的压缩率,并且速度更快。请参阅 存档 进行比较。

简单方法

如果您只想将整个表直接导入 parquet 文件,可以使用方便的 [infer_schema()]。它尝试根据 sqlite 架构猜测最佳编码。

let cols = sqlite2parquet::infer_schema(&conn, "my_table")
.unwrap()
.collect::<anyhow::Result<Vec<_>>>()
.unwrap();
let out_path = std::fs::File::create("my_table.parquet").unwrap();
sqlite2parquet::write_table(&conn, "my_table", &cols, &out_path, 1_000_000).unwrap();

灵活方法

显式定义将放入 parquet 文件中的列。需要注意的一点是:所有的 SELECT 查询都必须返回相同数量的行。如果不一致,您将收到运行时错误。

use sqlite2parquet::*;
let cols = vec![
Column {
name: "category".to_string(),
required: true,
physical_type: PhysicalType::ByteArray,
logical_type: Some(LogicalType::String),
encoding: None,
dictionary: true,
query: "SELECT category FROM my_table GROUP BY category ORDER BY MIN(timestamp)".to_string(),
},
Column {
name: "first_timestamp".to_string(),
required: true,
physical_type: PhysicalType::Int64,
logical_type: Some(LogicalType::Timestamp(TimeType { utc: true, unit: TimeUnit::Nanos })),
encoding: Some(Encoding::DeltaBinaryPacked),
dictionary: false,
query: "SELECT MIN(timestamp) FROM my_table GROUP BY category ORDER BY MIN(timestamp)".to_string(),
},
];

let out_path = std::fs::File::create("category_start_times.parquet").unwrap();
write_table(&conn, "category_start_times", &cols, &out_path, 1_000_000).unwrap();

依赖项

~38MB
~619K SLoC