Tableauデータ抽出APIによる抽出ファイル (TDE) の作成

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Tableauのデータ抽出APIを利用することによって、データ抽出 (TDE) ファイルを直接作成する方法をご紹介します。
データ抽出APIは C/C++、Java および Pythonで動作します。Linux及びWindowsのどちらのOSからもTDEファイルを生成できます。Tableauは、それらの抽出ファイルにネイティブに接続可能できます。

  • データ抽出 API – Python – 32 ビット
  • データ抽出 API – Python – 64 ビット
  • データ抽出 API - C/C++/Java – 32 ビット
  • データ抽出 API - C/C++/Java – 64 ビット

今回はAmazon LinuxからPythonのデータ抽出API(64Bit)の利用方法について解説します。

tableau-data-extract-api-for-linux

ダウンロード

Tableauページにログイン(要ユーザー登録/無料)後、以下ページにアクセスし、『DOWNLOAD THE EXTRACT API NOW』をクリック。

tableau-data-extract-api-01

別ウインドウが起動するので、チェックボックスを選択して『DOWNLOAD NOW』を押下。

tableau-data-extract-api-02

各種APIのダウンロード画面に遷移します。Linux系、Windows系双方で展開されている事が確認出来ます。

tableau-data-extract-api-03

Linux用Python版64bitのものをダウンロード&展開してみたもののスクリーンショットです。

tableau-data-extract-api-04

APIドキュメントやサンプルについても充実している様です。実際の内容や挙動についてはこの辺りを御覧頂けます。

tableau-data-extract-api-05

 インストール

インストールした環境のPythonはバージョン2.6.9です。データ抽出APIは各言語のAPIと共有ライブラリ(.soや.dll)が配布提供されています。

$ python -V
Python 2.6.9

$ tar xfz TDE-API-Python-Linux-64Bit.gz
$ ll
drwxrwxr-x 5 ec2-user ec2-user     4096 12月 13 03:07 DataExtract-8300.14.1212.0958

$ sudo python setup.py build
running build
running build_py
creating build
 :
 :
symbolically linking build/lib/dataextract/lib/libicutu.so.50 -> libicutu.so.50.1.2

$ sudo python setup.py install --record uninstall_files.txt
running install
running build
running build_py
symbolically linking build/lib/dataextract/lib/libicule.so.50 -> libicule.so.50.1.2
 :
 :
writing list of installed files to 'uninstall_files.txt'

※ アンインストールの方法

cat uninstall_files.txt | xargs rm -rvf

 

2015/1/14 補足:Windows環境へのインストール
C:\Python27\Lib\の下にTableauディレクトリを作成し、その下にダウンロードしたファイルを展開します。展開したDataExtract-8300.14.1212.0958ディレクトリの下に移動してインストールコマンドを実行します。

C:\> cd C:\Python27\Lib\Tableau\DataExtract-8300.14.1212.0958
C:\Python27\Lib\Tableau\DataExtract-8300.14.1212.0958> python setup.py install

データ抽出ファイルの作成

データ抽出ファイルの手順

  • Step 1:抽出ファイルのオープン
  • Step 2:テーブルに含まれるカラムを定義
  • Step 3:テーブルの追加
  • Step 4:データの登録
  • Step 5:抽出ファイルのクローズ

Step 1:抽出ファイルのオープン

抽出ファイル名を指定してオープンします。ファイルが存在しない場合は新規に作成され、ファイルが存在する場合は既存のファイルにレコードを追加することができます。

extract = Extract(filename)

Step 2:テーブルに含まれるカラムを定義

テーブルのカラムを定義します。抽出ファイルのデータ型は以下の8種類です。

tableDef = TableDefinition()
tableDef.addColumn('id', Type.INTEGER)
tableDef.addColumn('value', Type.DOUBLE)
tableDef.addColumn('code', Type.CHAR_STRING)
tableDef.addColumn('flag', Type.BOOLEAN)
tableDef.addColumn('duration', Type.DURATION)
tableDef.addColumn('text', Type.UNICODE_STRING)
tableDef.addColumn('expiration', Type.DATE)
tableDef.addColumn('created', Type.DATETIME)

Step 3:テーブルの追加

テーブル名として"Extract"を指定します。"Extract"以外を指定するとエラーとなります。よって、抽出ファイルには1つのテーブル("Extract")以外は登録できませんでした。

table = extract.addTable('Extract', tableDef)

Step 4:データの登録

row = Row(tableDef)
for i in range(1, 100):
    row.setInteger(0, i)
    row.setDouble(1, i*100)
    row.setCharString(2, 'AD' + str(i))
    row.setBoolean(3, 'true')
    row.setDuration(4 ,1 ,6 ,3 , 10, 15)
    row.setString(5, u'')
    row.setDate(6, 2020, 1, 1);
    row.setDateTime(7, 2015, 1, 12, 12, 15, 45, 4550);
    table.insert(row)

Step 5:抽出ファイルのクローズ

Step 1のオープンに対するクロースです。

extract.close()

データ抽出ファイルの作成のサンプルコード

#!/usr/bin/python
# -*- coding: utf-8 -*-
from dataextract import * 
import os

# 抽出ファイル名
filename = 'sample.tde'

# Step 0 既存の抽出ファイルを削除
if os.path.exists(filename):
    os.remove(filename)

# Step 1 抽出ファイルのオープン
extract = Extract(filename)

# Step 2 テーブルに含まれるカラムを定義
tableDef = TableDefinition()
tableDef.addColumn('id', Type.INTEGER)
tableDef.addColumn('value', Type.DOUBLE)
tableDef.addColumn('code', Type.CHAR_STRING)
tableDef.addColumn('flag', Type.BOOLEAN)
tableDef.addColumn('duration', Type.DURATION)
tableDef.addColumn('text', Type.UNICODE_STRING)
tableDef.addColumn('expiration', Type.DATE)
tableDef.addColumn('created', Type.DATETIME)

# Step 3 テーブルの追加
table = extract.addTable('Extract', tableDef)

# Step 4 データの登録
row = Row(tableDef)
for i in range(1, 100):
    row.setInteger(0, i)
    row.setDouble(1, i*100)
    row.setCharString(2, 'AD' + str(i))
    row.setBoolean(3, 'true')
    row.setDuration(4 ,1 ,6 ,3 , 10, 15)
    row.setString(5, u'もちろん日本語もOKです!')
    row.setDate(6, 2020, 1, 1);
    row.setDateTime(7, 2015, 1, 12, 12, 15, 45, 4550);
    table.insert(row)

# Step 5 抽出ファイルのクローズ
extract.close()

付属のサンプルコードの紹介

抽出ファイルAPIのアーカイブには有益なサンプルコードがりますのでご紹介します。ファイルは"samples"ディレクトリ以下にあります。

$ ll DataExtract-8300.14.1212.0958/samples/
合計 20
-rw-r--r-- 1 ec2-user ec2-user 5336 12月 13 02:59 csv2tde.py
-rw-r--r-- 1 ec2-user ec2-user 2656 12月 13 02:59 makeorder.py
-rw-r--r-- 1 ec2-user ec2-user  209 12月 13 02:59 orders.csv
-rw-r--r-- 1 ec2-user ec2-user  156 12月 13 02:59 schema.ini

抽出ファイルを作成 - makeorder.py

抽出ファイルをオープンする際のエラーハンドリングで、抽出ファイルの重複チェックする方法が紹介されています。

CSVファイルから抽出ファイル(TDE)を作成 - csv2tde.py

データソースであるCSVファイル(orders.csv)やテーブルに含まれるカラムを定義(schema.ini)を外部ファイルから読み込むようになっていたり、一般的なデータ型と抽出ファイルのデータ型とのマッピングについてもあり、より実践的なサンプルとして利用できそうです。

まとめ

テーブル名に"Extract"以外を指定するとエラーとなり、抽出ファイルには1つのテーブル("Extract")以外は登録できませんので、複数テーブルを利用する場合は抽出ファイルを複数作成し、データブレンディングする必要があります。 データ抽出APIのエンジンはネイティブの共有ライブラリ(so、dll)として提供されており、高速に動作することが期待できます。既存の異なるデータソースをデータ抽出ファイルに変換して活用していただければ幸いです。