この記事は Snowflakeのカレンダー | Advent Calendar 2023 - Qiita Part2の8日目です。
こんにちは、スタッフエンジニアの @kenkoooo です。Rust 版 Snowflake ドライバー snowflake-connector-rs をオープンソースで公開しました。
Snowflake とは?
Snowflake とは Snowflake Inc. が提供するデータプラットフォームです。estie では様々なデータソースから集めてきたデータを Snowflake に集積し、Snowflake 上で加工して、各プロダクトに送っています。動作が高速で、細やかな権限管理ができるので、とりあえず Snowflake にデータを入れるようになり、それらを組み合わせてさらなる価値を生み出すことができるようになってきました。
なぜ Rust?
いくつかのプログラミング言語については Snowflake から公式のドライバーが提供されています。実際、社内のデータ基盤系で使われている Python のコードベースでは、公式の Python 用ドライバーを使っています。しかし、Rust 用のドライバーは提供されておらず、社内で動いている Rust 製サービスはデータのロード部分のみ Python で実装するなどで対処しており、Rust 版の Snowflake ドライバーの需要は高まりつつありました。
使い方
Rust プロジェクトの Cargo.toml の dependencies に snowflake-connector-rs を追加してください。
[dependencies] snowflake-connector-rs = "0.1"
クライアントの作成と、クエリの実行は次のように書けます。
// Snowflake のユーザー情報 let username = "...".to_string(); let password = "...".to_string(); let account = "...".to_string(); // 利用するリソースの情報 let role = "...".to_string(); let warehouse = "...".to_string(); let database = "...".to_string(); let schema = "...".to_string(); // クライアントを作成する let client = SnowflakeClient::new( &username, SnowflakeAuthMethod::Password(password), SnowflakeClientConfig { account, warehouse: Some(warehouse), database: Some(database), schema: Some(schema), role: Some(role), }, )?; // ログインしてセッションを作成する let session = client.create_session().await?; // クエリを実行して結果を取得する let query = "SELECT * FROM BUILDINGS"; let rows = session.query(query).await?; for row in rows { let id: i64 = row.get("ID")?; let name: String = row.get("NAME")?; println!("id: {id}, name: {name}"); }
仕組みの一部をご紹介
Snowflake は PostgreSQL 互換のクエリ言語を用いてデータを読み書きするため、ウェブ UI やライブラリから利用していると、あたかもよくある SQL を使っているかのように感じられます。しかし、これらのライブラリは内部的には HTTP で通信していて、いわゆる SQL ドライバの実装とは全く異なります。
例えば、クエリの結果が巨大な場合、MySQL などは巨大な結果をそのまま返します。
一方で、Snowflake は結果を分割して返します。このとき、分割されたチャンクのうち一部はリクエストに対するレスポンスに含めて返されます。残りのチャンクは S3 にアップロードされ、その S3 オブジェクトへのリンクのリストがレスポンスに入って返されます。
SQL 文でクエリを書いた結果が S3 にアップロードされ、そのリンクが返ってくるのは、クラウドネイティブという感じで面白いですね。
最後に
snowflake-connector-rs には estie 社内での最低限のユースケースを満たすもののみが実装されています。また、Snowflake が非同期に結果を返すケースなど、カバーできていないケースがあることも分かっています。もし、お使いいただき、動かないケースなどありましたら、お気軽に Issue や Pull Request をお送りください。よろしくお願いいたします!
一緒に実装してやるぜ!という方は、ぜひご応募ください。こちらもよろしくお願いいたします!