TableauからHiRDBに接続する(第1回)

# はじめに
生成AIをはじめとし、近年データ利活用の重要性が急速に高まっています。その基礎である、データの可視化・分析はさまざまなビジネス領域において意思決定を支援する重要な手段です。

このような背景の中、私が開発を担当するHiRDBもお客さまのデータ利活用に貢献するため、BIツールとの連携強化を進めています。

そこで本記事では、BIツールの中でも特に著名なTableauについて、HiRDBとの接続を検証した結果をご紹介します。

# Tableauとは
Tableauとはデータの可視化や分析を可能にすることで、データ利活用の手助けをしてくれるBIツールです。

https://www.tableau.com/ja-jp/why-tableau/what-is-tableau

# HiRDBとは
HiRDBは、金融・公共・交通・通信をはじめとしたミッションクリティカルなシステムのデータ管理の要として、社会インフラを支えています。メインフレームで培った高信頼化技術やノウハウを継承し、オープンシステムで進化した純国産のリレーショナルデータベースです。

最新のHiRDB Version 10では、パブリッククラウドへの移行性向上を強化しています。最近では、データ利活用推進、および開発コスト低減を図るため、他社の製品との連携も推進しています。

https://www.hitachi.co.jp/Prod/comp/soft1/hirdb/index.html

ミッションクリティカル分野に適したデータベースとして、HiRDBはサポートの充実やさまざまな特長を兼ね備えています。さらに、HiRDBは時代に合わせて進化を続け、クラウドへの移行性向上、セキュリティの強化などアップデートが進められています。

![feature.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896270/3b23b335-fde4-c505-abe1-2341da274786.png)
[HiRDB Version 10 のご紹介](https://www.hitachi.co.jp/Prod/comp/soft1/hirdb/files/intro/download/hirdb_v10.pdf)

<br>

～～ちなみに～～
HiRDBは今年で30周年を迎えました。
日立の公式Webサイトに特設ページもあるので、ご興味ある方は是非ご覧ください。

https://www.hitachi.co.jp/Prod/comp/soft1/hirdb/30th_anniversary/index.html

# TableauからHiRDBに接続したい
### 接続するには
Tableauからデータベースのデータにアクセスするには、コネクターが必要になります。コネクターにより、Tableau側の処理をデータベースが解釈可能なSQLに変換します。

![tableau_connector1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896270/7b203b79-8f93-1c39-68e2-dd9ba947c44e.png)


コネクターは以下の方法で準備します。
- Tableau公式が公開しているコネクターを用いる
- ベンダーが公開しているコネクターを用いる
- 自身でコネクターを作成する

HiRDB用のコネクターはまだ存在していませんので、今回このコネクターを作成していきます。コネクターはTableauが公開しているTableau Connector SDKにより作成することができます。

https://tableau.github.io/connector-plugin-sdk/docs/example

### 手順の概要
次の流れでコネクターを作成していきます。

1\. Tableau Connector SDKをインストールする

2\. 設定用ファイルを作成する

<table>
    <caption>主要なファイル</caption>
            <tr>
              <th width="35%">ファイル名</th>
              <th>役割</th>
            </tr>
            <tr>
              <td>Manifest file</td>
              <td>コネクターの名前や、コネクター・DBの仕様についてTableauに連携する</td>
            </tr>
            <tr>
              <td>Tableau Connection Dialog File</td>
              <td>コネクションダイアログのカスタマイズ</td>
            </tr>
            <tr>
              <td>Connector Resolver file</td>
              <td>設定用のスクリプトを呼び出し、DBとの接続確立を行う</td>
            </tr>
            <tr>
              <td>Tableau Dialect file(Dialect)</td>
              <td>Tableau側からDBのデータを取得する際のSQLの記述を定義</td>
            </tr>
</table>

3\. テストツールによりTableauとDBの接続～クエリなどの処理が実行できることを確認する

4\. 作成したファイルをパッケージ(TACOファイル)にまとめる

<br>
<br>
続いて、実際にコネクターを使用しDBに接続した際の処理の流れを確認してみます。

## 処理の流れとDBの仕様差異
### 処理の流れ

例えば、Tableauを用い接続先DBのデータについて平均値や絶対値を求める場合、Tableau関数のAVG関数やABS関数を使用します。

以下のように、Tableau側の処理がコネクターによりSQLに変換されることで処理が実行されます。

![tableau_connector_abs.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896270/a7751898-bb14-a571-9f70-2248df73db81.png)

処理のイメージを理解したうえで、コネクターの作成について考えていきます。

### DBの仕様差異
手順でも触れたようにコネクターの作成には多くのファイルを用意する必要があり、ゼロから作成するには時間がかかります。

そこで、Tableau公式が公開しているPostgreSQL用のコネクターを参考にすることで、作業時間の短縮を図ろうと思います。  

しかし、PostgreSQLとHiRDBではSQLの構文・関数のサポート状況や仕様に差異があるため、このコネクターをそのまま用いた場合、HiRDBでは実行できないSQLが生成されエラーになってしまいます。

そのため、PostgreSQL用のコネクターを参考にする場合、SQLの仕様差異がある部分について書き換えが必要になります。

### 例えば
部分文字列の位置を特定するTableau関数としてFIND関数があります。
PostgreSQL接続用のコネクターでは、SQLへ変換する際にはSTRPOS関数を用いますが、HiRDBにはSTRPOS関数はなく、同等の処理にPOSSTR関数を用いる必要があります。

<br>

![tableau_connector_hirdb_strpos.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896270/25a86968-7b1d-fc61-ffed-a3e9915562ed.png)

PostgreSQL用コネクターでは上のように変換されますが、HiRDBにはSTRPOS関数はないためエラーとなります。

<br>

![tableau_connector_hirdb_posstr.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3896270/a87e5d1e-7155-a642-ae5d-41f351913da8.png)

HiRDBで実行可能な関数(POSSTR関数)を用いた処理に変換されるよう設定する必要があります。
<br>
こうしたSQLへの変換のルールについてはcapabilityやDialectにより設定することができます。そのため、これらのファイルはコネクターにおける特に重要な要素と言えます。

## capability
Manifest fileに記述する要素で、接続先DBでどのような句・構文が使用できるか、接続先DBにおける制限事項があるかなどを記述します。

Tableau関数などをSQLに変換した際、DB側でサポートしていない構文・関数が使用されたSQLが生成されてしまうと、当然DB側でエラーが発生します。

capabilityを記述することで、この変換について制限や代替方法を設定することができます。

https://tableau.github.io/connector-plugin-sdk/docs/capabilities

### capabilityの設定項目の例
capabilityでは以下の項目などについて設定することができます。
<table>
                <tr>
                  <th>設定項目</th>
                  <th>設定内容</th>
                </tr>
                <tr>
                  <td>CAP_QUERY_HAVING_UNSUPPORTED&emsp;</td>
                  <td>DBがHAVING句をサポートしているか</td>
                </tr>
                <tr>
                  <td>CAP_CREATE_TEMP_TABLES</td>
                  <td>DBが一時表をサポートしているか</td>
                </tr>
                <tr>
                  <td>CAP_QUERY_SUBQUERIES_WITH_TOP</td>
                  <td>DBがサブクエリ内でのTOPやLIMITによる行制限をサポートしているか</td>
                </tr>
</table>
              
## Tableau Dialect file(Dialect)
上述のようにTableauからDBのデータにアクセスする際には、Tabelau側の関数などの処理をSQLに変換する必要があります。

このTabelau側の関数をSQLに変換する、具体的な定義を記述するのがTableau Dialect Fileです。

https://tableau.github.io/connector-plugin-sdk/docs/dialect

### Tableau Dialect fileの記述例
例えば、絶対値を求めるABS関数の場合は以下のように記述します。
参考 : [connector-plugin-sdk](https://github.com/tableau/connector-plugin-sdk/blob/master/samples/plugins/postgres_jdbc/dialect.tdd)

```:Dialct記述例 ABS関数
<function group='numeric' name='ABS' return-type='real'>
  <formula>ABS(%1)</formula>
  <argument type='real' />
</function>
```

1行ずつ確認していきます。
<br>
```:1行目
<function group='numeric' name='ABS' return-type='real'>
```
functionタグのgroupが関数の分類を、nameがどのTabelau関数に対する定義かを、return-typeがTableau関数の戻り値を示しています。
<br>
```:2行目
<formula>ABS(%1)</formula>
```
SQLへ変換する際の、SELECT句の中身を示しています。つまり今回の場合は<br>「SELECT ABS(%1) FROM ~」のように置き換えられます。

%1は引数で、実際に関数を実行する際には列名や値が入ります。
<br>
```:3行目
<argument type='real' />
```
Tableau関数の引数の型を示しています。
<br>
```:4行目
</function>
```
functionタグの終わりです。

<br>
TableauのABS関数は、多くのRDBがサポートしているABS関数で同等の処理が実行できるため、単純な置き換えで記述できます。

一方、RDBがサポートしていないTableau独自の関数については、RDBがサポートしている関数や演算を組み合わせた複雑な置き換えが必要になります。

次回はそういった複雑な置き換えについて検討していきたいと思います。

## 次回
実際にcapabilityとDialectを書いてみます。

## 商標
Tableauは、salesforce.com,Inc.の商標です。
その他記載の会社名、製品名は、それぞれの会社の商標もしくは登録商標です。