Tableau Hyper APIが登場したので使ってみた #tableau

こんちわ。データアナリティクス事業本部@大阪の玉井です。

待望のAPIがTableauから登場したので紹介します。

Hyper APIとは

簡単にいうと、抽出ファイルをいじれるものになります。今まで抽出ファイルに関するAPIは、既存データを抽出ファイルに変換するのはできたのですが、抽出ファイルに何かを入れたりするのはできませんでした。それがこのHyper APIで可能となります。

できること

  • 抽出ファイルに対してCRUD処理ができる
  • Tableauがネイティブ対応していないデータソースも抽出ファイルにできる
  • 抽出ファイルに対するETL処理を自動化できる
  • 抽出ファイルからデータを抜き出すことができる

使用できる言語

APIという名前ですが、下記の言語に組み込んで使用するものになります。curlとかでエンドポイントに向かってリクエストするみたいな使い方は無いので注意しましょう。

  • Python (3.6 or newer)
  • C++ (C++11 or newer)
  • Java (Java 8 or newer)
  • C#/.NET (.NET Standard 2.0)

動作環境

普通のPCなら大丈夫かと思われます。

  • Microsoft Windows Server 2016, 2012, 2012 R2, 2008 R2, 2019
  • Amazon Linux 2, Red Hat Enterprise Linux (RHEL) 7.3+, CentOS 7.3+, Oracle Linux 7.3+, Ubuntu 16.04 LTS and 18.04 LTS
  • Microsoft Windows 7 or newer (64-bit)
  • macOS 10.11 or newer

最小ハードウェア要件

こちらも、普通のPCなら大丈夫かと思われます。

  • Intel Nehalem or AMD Bulldozer processor or newer
  • 2 GB memory
  • 1.5 GB minimum free disk space

Hyper APIをインストールする

作業環境

  • Windows 10 Pro 64bit
  • Python 3.7

ダウンロード

下記からダウンロードします。今回はPython版を使用します。

上記2つのファイルをダウンロードします。

インストール

tableauhyperapiモジュール(さっきダウンロードした.whl)をインストールします。公式ドキュメントでは、venvで仮想環境を作成した上でやっていますが、私はとりあえずそのままブッ込みました。

>pip install tableauhyperapi-0.0.8707-py3-none-win_amd64.whl
Processing c:\users\tamai.rei\temp\tableauhyperapi-0.0.8707-py3-none-win_amd64.whl
Collecting cffi<2,>=1.12.2 (from tableauhyperapi==0.0.8707)
  Downloading https://files.pythonhosted.org/packages/2f/ad/9722b7752fdd88c858be57b47f41d1049b5fb0ab79caf0ab11407945c1a7/cffi-1.12.3-cp37-cp37m-win_amd64.whl (171kB)
     |████████████████████████████████| 174kB 3.3MB/s
Collecting pycparser (from cffi<2,>=1.12.2->tableauhyperapi==0.0.8707)
  Downloading https://files.pythonhosted.org/packages/68/9e/49196946aee219aead1290e00d1e7fdeab8567783e83e1b9ab5585e6206a/pycparser-2.19.tar.gz (158kB)
     |████████████████████████████████| 163kB 3.3MB/s
Installing collected packages: pycparser, cffi, tableauhyperapi
  Running setup.py install for pycparser ... done
Successfully installed cffi-1.12.3 pycparser-2.19 tableauhyperapi-0.0.8707

サンプルを動かしてみる

ダウンロードしたZipファイルの中には、いくつかサンプルスクリプトがあります。

こちらも公式ドキュメントで紹介されているinsert_data_into_single_table.pyを実行してみます。

このスクリプトの内容

同じディレクトリに存在する抽出ファイルに2件の顧客情報をインサートする、という内容になっています。下記にスクリプトの一部を抜粋します。

カラム定義

extract_table = TableDefinition(
    name=TableName("Extract", "Extract"),
    columns=[
        TableDefinition.Column(name='Customer ID', type=SqlType.text(), nullability=NOT_NULLABLE),
        TableDefinition.Column(name='Customer Name', type=SqlType.text(), nullability=NOT_NULLABLE),
        TableDefinition.Column(name='Loyalty Reward Points', type=SqlType.big_int(), nullability=NOT_NULLABLE),
        TableDefinition.Column(name='Segment', type=SqlType.text(), nullability=NOT_NULLABLE)
    ]
)

インサートするデータ

 data_to_insert = [
                ["DK-13375", "Dennis Kane", 518, "Consumer"],
                ["EB-13705", "Ed Braxton", 815, "Corporate"]
 ]

対象の抽出ファイル

path_to_database = Path("customer.hyper")

ちなみに抽出ファイルが存在しない場合は、この2件の顧客情報の抽出ファイルが作成されるようになっています(ちゃんとカラムも指定されています)。

実行してみる

> python insert_data_into_single_table.py
EXAMPLE - Insert data into a single table within a new Hyper file
Tables available in customer.hyper are: [TableName('Extract', 'Extract')]
The number of rows in table "Extract"."Extract" is 2.
The connection to the Hyper file has been closed.
The Hyper process has been shut down.

customer.hyperが作成されました。中身を見てみます。

インサートする情報をちょっと増やしてみます。

 (省略)
 data_to_insert = [
                ["DK-13375", "Dennis Kane", 518, "Consumer"],
                ["EB-13705", "Ed Braxton", 815, "Corporate"],
                ["cm-001", "rei tamai", 777, "Vice President"],
 ]
(省略)

そして、再度スクリプトを実行すると、同一抽出ファイルにしっかり追加されました。

ちなみに、定義されたカラム数より多くの項目を入れようとすると、ちゃんとエラーが出る仕組みになっていました。

Tableau Serverへのパブリッシュについて

上記の例の通り、Hyper APIはあくまでローカル内での動作にとどまります。Hyper APIで作業した抽出ファイルをパブリッシュしたい場合、Tableau Desktopとかtabcmd等を使って、別途パブリッシュする必要があります。

おわりに

個人的に気になっているのは、Hyper APIに対する他製品の対応です。例えばAlteryxは処理したデータを抽出ファイルとして保存したり、Tableau Serverにパブリッシュしたりする機能を有していますが、このHyper APIに対応してもらえると、ついにインプットファイルに抽出ファイルを指定できるようになる(はず)ので、一層TableauとAlteryxの連携が便利になると思っています。