CData CSV ODBC DriverでS3上のCSVファイルにアクセスする

2024.02.28

こんにちは、なおにしです。

CData社の「CSV ODBC Driver」を用いてローカル環境(Mac)からS3上のCSVにアクセスする機会がありましたのでご紹介します。

はじめに

  • CSV ODBC Driver は有償ソフトです。今回は30日間の無償トライアルで検証しましたが、継続して利用するにはライセンス費用がかかりますので、詳細は製品ページをご参照ください。
  • IAMユーザとS3バケットの準備に関する説明は割愛します。
  • 検証を実施した環境のOS/CPU種別は以下のとおりです。
    • macOS Sonoma 14.3 / Apple Silicon

やってみた

CSV ODBC Driver のインストール

こちらから無償トライアル版のdmgファイルをダウンロードしてインストールします。

Launchpadでアイコンは表示されませんが、ドライバーは以下のフォルダにインストールされています。

$ ls /Applications/CData\ ODBC\ Driver\ for\ CSV
Readme.txt   bin          db           etc          help         lib          uninstall.sh

Readme.txtに従ってライセンスをインストールします。Readme.txtではinstall-licenseの引数にkeyを指定していますが、今回はトライアルとして使用するため何も指定せずに実行します。

$ cd "/Applications/CData ODBC Driver for CSV/bin"
$ sudo ./install-license

以下のように対話モードでライセンスのインストールを進めていきます。括弧書きのとおりトライアルライセンスを適用する際はプロダクトキーに「TRIAL」と入力します。

***************************************************************************
* License Activation for CSV Data Provider Version 23 *
***************************************************************************

Please enter your name and email address:
Name: xxx
Email Address: xxx@xxx

Please enter your Product Key:
  (you may use "TRIAL" as the product key to activate a trial license)
Product Key: TRIAL

Downloading license data...
Verifying license data...
License installation succeeded.

Press any key to exit...

ライセンスのインストールが完了するとホームディレクトリ配下の隠しフォルダにライセンスファイルが作成されるようです。

$ ls ~/.cdata
CData.ODBC.CSV.lic

しかし、私が試した環境ではライセンスファイルが作成されずに後続の操作でエラーが発生したため、sudoコマンドを外して再度ライセンスのインストールを行ったところ、上記のライセンスファイルが作成されました。

$ cd "/Applications/CData ODBC Driver for CSV/bin"
$ ./install-license

これでCSV ODBC Driver を使用する準備ができました。

ODBCドライバーマネージャー

CSV ODBC Driverのインストール画面の「はじめに」をよく見ると以下の記載があります。

ドライバーを使用するには、ODBCドライバーマネージャーが必要です。UnixODBCをiODBCの両ドライバーマネージャーがサポートされています。

MacやLinuxではCSV ODBC Driverをインストールしただけではアプリケーションから直接呼び出せません。これは、アプリケーションとODBCドライバーの間の仲介役となるODBCドライバーマネージャーが必要となるためです。

一方、WIndowsではOS自体にODBCドライバーマネージャーが内臓されているため、別途準備する必要はありません。というのも、ODBC自体がMicrosoft社が制定したものであり、そもそもWindowsで動作するものを別のプラットフォームでも動作させるためにODBCドライバーマネージャーが必要ということになります。

プラットフォーム ODBCドライバーマネージャー
Linux/Mac (UNIX) 別途準備が必要
Windows OSの一部として提供

そこで今回はCSV ODBC DriverでサポートされているODBCドライバーマネージャー「UnixODBC」と「iODBC」のそれぞれをCSV ODBC Driverと連携させてS3バケットに配置した「testdata.csv」を参照してみました。

なお、テストデータはこちらを使用させていただきました。

UnixODBCの場合

データソース名(DSN)の設定

Macの場合はhomebrewからUnixODBCをインストールできます。

$ brew install unixodbc

インストール後、各種構成は以下のコマンドで確認できます。

$ odbcinst -j   
unixODBC 2.3.12
DRIVERS............: /opt/homebrew/etc/odbcinst.ini
SYSTEM DATA SOURCES: /opt/homebrew/etc/odbc.ini
FILE DATA SOURCES..: /opt/homebrew/etc/ODBCDataSources
USER DATA SOURCES..: /Users/username/.odbc.ini
SQLULEN Size.......: 8
SQLLEN Size........: 8
SQLSETPOSIROW Size.: 8

上記のとおり、homebrewを利用した場合はhomebrewディレクトリ配下のetcディレクトリ内に設定ファイルが存在することにご注意ください。設定すべきファイルはetcディレクトリ配下の「odbcinst.ini」と「odbc.ini」です。UnixODBCをインストールした時点では、どちらも空ファイルの状態です。両ファイルに設定する内容のサンプルは、CSV ODBC Driverがインストールされたディレクトリ内に入っています。

$ cat /Applications/CData\ ODBC\ Driver\ for\ CSV/etc/odbcinst.ini
[ODBC Drivers]
CData ODBC Driver for CSV=Installed

[CData ODBC Driver for CSV]
Description = CData ODBC Driver for CSV
Driver = /Applications/CData ODBC Driver for CSV/lib/libcsvodbc.dylib
$ cat /Applications/CData\ ODBC\ Driver\ for\ CSV/etc/odbc.ini    
[ODBC Data Sources]
CData CSV Sys=CData ODBC Driver for CSV

[CData CSV Sys]
Driver = CData ODBC Driver for CSV
AWS Access Key=
AWS External Id=
AWS Region=NORTHERNVIRGINIA
AWS Role ARN=
AWS Secret Key=
Azure Access Key=
Azure Shared Access Signature=
Azure Storage Account=
Azure Tenant=
MFA Serial Number=
MFA Token=
Password=
Share Point Edition=SharePointOnline
SSL Mode=AUTOMATIC
Temporary Token Duration=3600
User=

odbcinst.iniについては内容をそのまま/opt/homebrew/etc/odbcinst.iniに転記します。odbc.iniについてはアクセスキーなどの必要な項目を埋めて、今回は使用しないパラメータについては削除し、最終的には以下のように設定しました。

$ cat /opt/homebrew/etc/odbc.ini  
[ODBC Data Sources]
CData CSV Sys=CData ODBC Driver for CSV

[CData CSV Sys]
Driver = CData ODBC Driver for CSV
ConnectionType=Amazon S3
AuthScheme=AwsRootKeys
AWS Region=tokyo
AWS Access Key=(アクセスキー)
AWS Secret Key=(シークレットキー)
URI=s3://(バケット名)/

CSVデータの読み取り確認

UnixODBCと一緒にインストールされたisqlコマンドからS3上のcsvファイルにアクセスします。

$ isql -v "CData CSV Sys"
+---------------------------------------+
| Connected!                            |
|                                       |
| sql-statement                         |
| help [tablename]                      |
| echo [string]                         |
| quit                                  |
|                                       |
+---------------------------------------+
SQL>

上記のようにSQLを実行するプロンプトが表示されれば接続成功です。実際にSQLを実行すると、以下のようにcsvファイルの内容を出力することができます。

SQL> select entrydate,age,totalmoney,birthday from testdata limit 5;
+-----------+------------+------------+-----------+
| entrydate | age        | totalmoney | birthday  |
+-----------+------------+------------+-----------+
| 2019-08-20| 64         | 63000      | 1956-06-28|
| 2020-01-14| 44         | 75000      | 1976-02-17|
| 2019-10-29| 59         | 88000      | 1961-06-12|
| 2020-01-08| 53         | 32000      | 1967-02-12|
| 2020-07-19| 69         | 98000      | 1951-03-16|
+-----------+------------+------------+-----------+
SQLRowCount returns -1
5 rows fetched
SQL>

iODBCの場合

データソース名(DSN)の設定

こちらからdmgファイルをダウンロードしてインストールします。

ターミナルから以下のコマンドを実行してiODBCドライバーマネージャーを管理者権限で起動します。

$ sudo /Applications/iODBC/iODBC\ Administrator64.app/Contents/MacOS/iODBC\ Administrator64

起動画面より[System DSN]タブ - [CData CSV Sys] - [Configure]を選択し、以下のとおり設定します。

Keyword Value
AWS Access Key アクセスキー
AWS Region tokyo
AWSSecretKey シークレットキー
URI s3://(s3バケット名)/
ConnectionType Amazon S3
AuthScheme AwsRootKeys

[Configure]ボタン下の[Test]を選択します。「Username」と「Password」の入力を求められますが入力せずに[OK]で進んで問題ありません。以下のメッセージが出力されればS3と連携できています。

The connection DSN was tested successfully, and can be used at this time.

CSVデータの読み取り確認

iODBCドライバーマネージャーと一緒にインストールされた「iODBC Demo Unicode」をLaunchpadから起動します。

[Environment] - [Open Connection...]を開き、[System DSN] - [CData CSV Sys]を選択して[OK]ボタンを押下します。

「Username」と「Password」の入力を求められますが入力せずに[OK]します。

ウィンドウの上部が「Disconnected」から以下のように変わります。

[SQL] - [Execute SQL..]を開き、以下を実行します。

以下のように実行結果が表示されます。

終わりに

S3に格納したCSVファイルに対してクエリを発行してデータを探索する場合、AWS上であればAthenaを使ったりするかと思います。さらにAWS SDKと組み合わせればローカルのスクリプトでもデータにアクセスすることができますが、既製のデスクトップアプリケーションなどでは外部データにアクセスするためのインターフェースとしてODBCが準備されている(もしくはODBCしかない)パターンもあるかもしれません。
そんな時の選択肢の一つとして、この記事がどなたかのお役に立てれば幸いです。