概要
Spotfire ServerからAmazon Athenaを介してAmazon S3バケット上のデータを利用する方法について説明します。
Spotfireでは、2024年1月時点で、S3バケット内のファイルに対して直接接続するための標準機能は提供されていません。
一方で、Athenaへの接続については、インフォメーションリンクにより実現可能となっています。
本記事では、S3バケット上のCSVファイルにクエリを実行するための外部テーブルをAthenaで作成し、Spotfire ServerからAthena JDBCドライバにより、その外部テーブルに接続しクエリを実行します。
検証環境
製品・サービス | バージョン | 備考 |
---|---|---|
Spotfire Server | 14.0.1 | Windows Server 2022環境で実行 |
Amazon Athena | Athena engine version 3 | |
Athena JDBCドライバ | 2.0.34 |
データソーステンプレート作成に記載している本記事において使用したデータソーステンプレート(XML形式)が、2024年1月時点で、Athena JDBCドライバ 2.0.xを対象としたものであるため、左記のバージョンを使用しています。 |
S3バケット上のデータ
S3バケットに格納されている3種類のCSVファイルを利用します。
orders
products
stores
Athenaで定義する外部テーブル
Spotfire Serverからのクエリ実行先となるAthenaの外部テーブルを以下のように定義します。
データベース名はtibco_athena
としています。
orders
CREATE EXTERNAL TABLE IF NOT EXISTS `tibco_athena`.`orders` ( `orderid` int, `date` date, `storeid` int, `productid` int, `quantity` int ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ( 'field.delim' = ',', 'skip.header.line.count' = '1' ) STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://<S3 BACKET NAME>/<PATH>' TBLPROPERTIES ( 'classification' = 'csv');
作成したテーブルに対するクエリ実行結果は以下のとおりです。
products
CREATE EXTERNAL TABLE IF NOT EXISTS `tibco_athena`.`products` ( `productid` int, `category` varchar(100), `productname` varchar(100), `price` int ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ( 'field.delim' = ',', 'skip.header.line.count' = '1' ) STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://<S3 BACKET NAME>/<PATH>' TBLPROPERTIES ( 'classification' = 'csv');
作成したテーブルに対するクエリ実行結果は以下のとおりです。
stores
CREATE EXTERNAL TABLE IF NOT EXISTS `tibco_athena`.`stores` ( `storeid` int, `storename` varchar(100), `prefecture` varchar(100), `area` varchar(100) ) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe' WITH SERDEPROPERTIES ( 'field.delim' = ',', 'skip.header.line.count' = '1' ) STORED AS INPUTFORMAT 'org.apache.hadoop.mapred.TextInputFormat' OUTPUTFORMAT 'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat' LOCATION 's3://<S3 BACKET NAME>/<PATH>' TBLPROPERTIES ( 'classification' = 'csv');
作成したテーブルに対するクエリ実行結果は以下のとおりです。
インフォメーションリンク設定
Athena JDBCドライバ配置
Athena JDBCドライバ 2.0.xをダウンロードし、Spotfire Server実行環境の以下のパスに配置します。
<Spotfire Serverインストールフォルダ>\tomcat\custom-ext-informationservices
本記事では、AthenaJDBC42-2.0.34.1000.jarを配置しています。
AthenaJDBC42-2.0.34.1000.jarは、2024年1月時点で以下のURLから取得可能です。
https://s3.amazonaws.com/athena-downloads/drivers/JDBC/SimbaAthenaJDBC-2.0.34.1000/AthenaJDBC42-2.0.34.1000.jar
データソーステンプレート作成
Spotfire Server実行環境にて、Configuration Toolを起動し、ConfigurationタブのData Source Templatesに移動し、Athena接続用の新しいデータソーステンプレートを作成します。
記述するテンプレートは以下のとおりです。
<jdbc-type-settings>
<type-name>Amazon Athena JDBC</type-name>
<driver>com.simba.athena.jdbc.Driver</driver>
<connection-url-pattern>jdbc:awsathena://athena.<region>.amazonaws.com:443;s3_staging_dir=<staging_dir></connection-url-pattern>
<table-types>DATA, EXTERNAL_TABLE, TABLE, VIEW, VIRTUAL_VIEW</table-types>
<supports-catalogs>true</supports-catalogs>
<supports-schemas>true</supports-schemas>
<supports-procedures>false</supports-procedures>
<always-use-prepared-statement>false</always-use-prepared-statement>
</jdbc-type-settings>
データソーステンプレートの詳細についてはSpotfire® JDBC Data Access Connectivity Details - Amazon Athenaを参照してください。
データソーステンプレートの名前(Name)は任意のものでかまいません。
StatusがXML Parsed OK
となっていることを確認のうえ、Save configurationから設定をリポジトリDBに保存し、Spotfire Serverサービスを再起動します。
データソース作成
Spotfire Serverに接続した状態のSpotfire Analyst上でインフォメーションデザイナーを起動し、Athenaに接続するためのデータソースを作成します。
項目 | 内容 |
---|---|
名前 | (任意の名称) |
タイプ |
Athena もしくは別名を付与したAthena用のデータソーステンプレート名 |
接続 URL |
|
ユーザー名 | Athenaにクエリを実行する権限のあるアクセスキーのアクセスキーID |
パスワード | Athenaにクエリを実行する権限のあるアクセスキーのシークレットアクセスキー |
インフォメーションリンク作成
作成したデータソースから、インフォメーションリンクを作成します。
本記事では、tibco_athenaデータベースを右クリックし、既定のインフォメーションモデルの作成を実施します。
インフォメーションリンク利用
作成したインフォメーションリンクをSpotfire Serverから実行し、Athenaからデータを取得します。
日本語文字列を含むデータ
テーブル名、カラム名、値に日本語文字列が含まれる場合もSpotfireからデータを取得することができます。
Athenaのテーブル名に日本語文字列が含まれることで、インフォメーションリンク実行時に以下のようなエラーが発生する場合がありますが
インフォメーションリンクのSQLを以下のように修正することで回避することができます。
複数テーブルの結合や計算カラムの追加
分析のためのデータ前処理として、
- Athena上の複数テーブルを結合
- カラム名の変更
- 計算カラムの追加
といった処理を行いたい場合、以下の2通りの方法が考えられます。
# | 方法 | 主な使用リソース |
---|---|---|
1 |
結合対象のAthena上テーブルをインフォメーションリンクにより個別にSpotfireにロードし、データキャンバス上で結合やカラム名の変更、計算カラム追加などの前処理を行う。 |
Spotfire Server実行環境のCPU・メモリ Spotfire Analyst実行環境のCPU・メモリ |
2 | Athenaに対し、複数テーブルの結合やカラム名の変更、計算カラム追加を実行するためのインフォメーションリンクを新たに作成し、Spotfireから実行する。 | Athenaエンジン |
2の方法により、データ前処理実施時にSpotfire Server実行環境やSpotfire Analyst実行環境にかかる負荷を軽減することができます。
詳細については、複数テーブルの結合・カラム名の変更・計算カラムの追加を参照してください。
Spotfireライブラリーへのデータ保存
Athenaを介して取得したS3バケット上のデータをSBDF (Spotfire Binary Data File) 形式でSpotfire Serverのライブラリー(リポジトリDB)に保存することができます。
Automation Servicesにより定期実行ジョブを作成しスケジュール設定を行うことで、自動的にS3データをライブラリーに保存することも可能です。
定期的にS3データをライブラリーに保存しておき、Spotfireの利用者がそのライブラリ上のSBDFファイルを利用することで、利用者が分析を行うたびにSpotfire ServerからAthenaに対してクエリを実行する必要がなくなります。
Automation Servicesを利用しデータをライブラリーに定期的に自動保存する方法についてはデータをライブラリーに自動保存する方法を参照してください。