120个版本 (34个稳定版)
12.0.0 | 2024年8月13日 |
---|---|
11.2.0 | 2024年6月24日 |
11.0.0 | 2024年5月24日 |
10.0.0 | 2024年5月18日 |
0.6.1 | 2021年11月30日 |
#53 在 数据库接口
2,383 每月下载量
在 4 个Crates中(直接使用2个) 使用
120KB
2K SLoC
arrow-odbc
从ODBC数据源填充Apache Arrow数组。 arrow-odbc
基于 arrow
和 odbc-api
库构建,允许您将ODBC数据源的数据作为Apache Arrow记录批次的序列读取。 arrow-odbc
还可以用于将Arrow记录批次的内容插入到数据库表中。
此仓库包含 arrow-odbc
Rust库的代码。包含 arrow-odbc
Python轮文件 的代码仓库位于 arrow-odbc-py
仓库。
关于Arrow
Apache Arrow 定义了一种与语言无关的列式内存格式,用于平面和分层数据,适用于在CPU和GPU等现代硬件上进行高效的分析操作。Arrow内存格式还支持零拷贝读取,以实现快速的数据访问而无需序列化开销。
关于ODBC
ODBC (开放式数据库连接) 是一种标准,它允许您使用SQL从各种数据源访问数据。
用法
use arrow_odbc::OdbcReaderBuilder;
// You can use the reexport of odbc_api to make sure the version used by arrow_odbc is in sync with
// the version directly used by your application.
use arrow_odbc::odbc_api as odbc_api;
use odbc_api::{Environment, ConnectionOptions};
const CONNECTION_STRING: &str = "\
Driver={ODBC Driver 17 for SQL Server};\
Server=localhost;\
UID=SA;\
PWD=My@Test@Password1;\
";
fn main() -> Result<(), anyhow::Error> {
let odbc_environment = Environment::new()?;
// Connect with database.
let connection = odbc_environment.connect_with_connection_string(
CONNECTION_STRING,
ConnectionOptions::default(),
)?;
// This SQL statement does not require any arguments.
let parameters = ();
// Execute query and create result set
let cursor = connection
.execute("SELECT * FROM MyTable", parameters)?
.expect("SELECT statement must produce a cursor");
// Read result set as arrow batches. Infer Arrow types automatically using the meta
// information of `cursor`.
let arrow_record_batches = OdbcReaderBuilder::new()
// Use at most 256 MiB for transit buffer
.with_max_bytes_per_batch(256 * 1024 * 1024)
.build(cursor)?;
for batch in arrow_record_batches {
// ... process batch ...
}
Ok(())
}
ODBC与Arrow类型匹配后进行查询
ODBC | Arrow |
---|---|
数值(p <= 38) | Decimal128 |
Decimal(p <= 38, s >= 0) | Decimal128 |
整数 | Int32 |
SmallInt | Int16 |
实数 | Float32 |
Float(p <=24) | Float32 |
Double | Float64 |
Float(p > 24) | Float64 |
日期 | Date32 |
LongVarbinary | Binary |
Timestamp(p = 0) | TimestampSecond |
Timestamp(p: 1..3) | TimestampMilliSecond |
Timestamp(p: 4..6) | TimestampMicroSecond |
Timestamp(p >= 7 ) | TimestampNanoSecond |
BigInt | Int64 |
TinyInt Signed | Int8 |
TinyInt Unsigend | UInt8 |
Bit | 布尔型 |
Varbinary | Binary |
Binary | FixedSizedBinary |
所有其他类型 | Utf8 |
将Arrow类型匹配到ODBC类型后插入
Arrow | ODBC |
---|---|
Utf8 | VarChar |
LargeUtf8 | VarChar |
Decimal128(p, s = 0) | VarChar(p + 1) |
Decimal128(p, s != 0) | VarChar(p + 2) |
Decimal128(p, s < 0) | VarChar(p - s + 1) |
Decimal256(p, s = 0) | VarChar(p + 1) |
Decimal256(p, s != 0) | VarChar(p + 2) |
Decimal256(p, s < 0) | VarChar(p - s + 1) |
Int8 | TinyInt |
Int16 | SmallInt |
Int32 | 整数 |
Int64 | BigInt |
Float16 | 实数 |
Float32 | 实数 |
Float64 | Double |
Timestamp s | Timestamp(7) |
Timestamp ms | Timestamp(7) |
Timestamp us | Timestamp(7) |
Timestamp ns | Timestamp(7) |
Date32 | 日期 |
Date64 | 日期 |
Time32 s | Time |
Time32 ms | VarChar(12) |
Time64 us | VarChar(15) |
Time64 ns | VarChar(16) |
Binary | Varbinary |
FixedBinary(l) | Varbinary(l) |
所有其他类型 | 不支持 |
插入映射尚未最优,但在投入大量工作改进它之前,我想知道用户是否会有这样的用例。因此,如果某些东西不起作用,但可能提供了更好的Arrow到ODBC类型的映射,请随意打开一个问题。如果您这样做,请尽可能提供您要尝试做的事情的上下文。
构建
要构建 arrow-odbc
并将其编译为您的Rust项目的一部分,您需要链接到一个ODBC驱动程序管理器。在Windows上,这已经是系统的一部分,因此不需要做任何事情。在Linux和MacOS上,建议安装UnixODBC。
Ubuntu
sudo apt-get install unixodbc-dev
Mac OS
brew install unixodbc
Mac OS ARM
在MacOS上,由于ARM的brew安装在cargo链接时找不到的目录中,因此可能有多种处理方法。由于作者无法访问ARM Mac,这里只收集了其他用户曾经使用过的一些方法。
- 使用make/configure从源代码安装unixODBC,而不是使用brew
- 使用brew安装unixODBC并为其二进制目录创建一个符号链接
sudo ln -s /opt/homebrew/lib /Users/<your name>/lib
依赖关系
~13–29MB
~455K SLoC