#apache-arrow #arrow #odbc #database-table #sql #data-access

arrow-odbc

从/向ODBC数据源读取/写入Apache Arrow数组

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数据库接口

Download history 449/week @ 2024-05-02 490/week @ 2024-05-09 867/week @ 2024-05-16 881/week @ 2024-05-23 951/week @ 2024-05-30 1618/week @ 2024-06-06 740/week @ 2024-06-13 791/week @ 2024-06-20 687/week @ 2024-06-27 764/week @ 2024-07-04 542/week @ 2024-07-11 427/week @ 2024-07-18 553/week @ 2024-07-25 466/week @ 2024-08-01 815/week @ 2024-08-08 486/week @ 2024-08-15

2,383 每月下载量
4 个Crates中(直接使用2个) 使用

MIT 许可协议

120KB
2K SLoC

arrow-odbc

Docs Licence Crates.io

从ODBC数据源填充Apache Arrow数组。 arrow-odbc 基于 arrowodbc-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