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 在 数据库接口
每月下载量 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 文件
本库提供以下两项功能
- 一种灵活的方法,可以从一组 SQL 语句生成 parquet 文件
- 一种生成将整个表写入 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