TableauのビューとデータソースをDatabricksのダッシュボードに表示してみた

## 前提
・利用環境：Databricks、Tableau Cloud

https://www.databricks.com/jp/try-databricks?scid=7018Y000001Fi15QAC&utm_medium=paid+search&utm_source=google&utm_campaign=17377047998&utm_adgroup=138148229998&utm_content=trial&utm_offer=try-databricks&utm_ad=732035937815&utm_term=databricks%20%E3%83%88%E3%83%A9%E3%82%A4%E3%82%A2%E3%83%AB&gad_source=1&gclid=CjwKCAiA8Lu9BhA8EiwAag16b8b3zbkIb3V7gp-8VUwKukXnhtVZRQ-1RY8SbETmGVgNT4bQramYmRoCX5wQAvD_BwE#account

https://www.tableau.com/ja-jp/trial/tableau-software

## 参考ドキュメント
https://docs.databricks.com/gcp/ja/languages/python

https://docs.databricks.com/aws/ja/dashboards

https://help.tableau.com/current/api/rest_api/en-us/REST/rest_api_ref.htm

## 参考ブログ
https://qiita.com/kktzn0920/items/b42c92c0ca9b72678809
## 操作手順（動画）
<iframe width="100%" height="315" src="https://www.youtube.com/embed/8VNNHNv7XZ0?si=r_lfJNY88Xzbzhkj" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

## 手順
#### 1.Tableau Cloudの個人アクセストークンを作成
参考：以下のブログの手順2

https://qiita.com/heanzza/items/ec6b93d0ec35719e5803#2tableau-cloud%E3%81%AEpat%E3%82%92%E4%BD%9C%E6%88%90

#### 2.TableauビューのイメージをDatabricksのダウンロード
①Databricksのホーム画面で、「新規」→「ノートブック」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/cf4951e4-c431-4015-ad71-2719496b1704.png)
②必要なライブラリをインストール
```
#ライブラリをインストール
!pip install requests
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/f8639971-e8bd-41d4-8155-2e83f134e721.png)
③DatabricksからTableau Cloudに認証して、Tokenを取得
以下の値は実際の値に置き換える
TABLEAU_TOKEN_VALUE
TABLEAU_TOKEN_NAME
TABLEAU_SERVER
TABLEAU_VERSION
site_url_id
```
# -*- coding: utf-8 -*-
import requests, json

TABLEAU_TOKEN_VALUE = '手順1で作成したTableauトークンのシークレット'  #TODO　Tableauの情報
TABLEAU_TOKEN_NAME = '手順1で作成したTableauトークン名'  #TODO  個人用アクセストークンの「トークン名」
TABLEAU_SERVER = '例：prod-apnortheast-a.online.tableau.com'  #TODO Tableauサーバのアドレス
TABLEAU_VERSION = '3.19'  #TODO Tabeleau ServerのAPI version

#Tableauサーバーへサインインする
server_name = TABLEAU_SERVER
version = TABLEAU_VERSION
site_url_id = "Tableau Cloudのサイト名"    # Site URLのパス、空白の場合はDefaultになる

# Personal Access Token を指定する
personal_access_token_name = TABLEAU_TOKEN_NAME      # Personal access tokenの名前
personal_access_token_secret = TABLEAU_TOKEN_VALUE   # Personal access token

signin_url = "https://{server}/api/{version}/auth/signin".format(server=server_name, version=version)   
payload = { "credentials": { "personalAccessTokenName": personal_access_token_name, "personalAccessTokenSecret": personal_access_token_secret, "site": {"contentUrl": site_url_id }}}

headers = {
	'accept': 'application/json',
	'content-type': 'application/json'
}
    
# サーバにRequestを送信する
req = requests.post(signin_url, json=payload, headers=headers, verify=False)
req.raise_for_status()

#HTTP Responseを取得
response = json.loads(req.content)

#credentialsのエレメントからTokenを取得する
token = response["credentials"]["token"]

#Site IDエレメントからSite IDを取得する
site_id = response["credentials"]["site"]["id"]

print('Sign in successful!')
print('Token: {token}'.format(token=token))
print('Site ID: {site_id}'.format(site_id=site_id))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/7831a492-ca00-4dbe-84c0-eb557f9e2ad7.png)
④TableauのビューIDを検索
VIEW_URL_NAMEは、実際のビュー名に変更
```
VIEW_URL_NAME = 'Overview' #TODO viewUrlNameの値（シート名）を入れる
#view idを探す
query_value=  "filter=viewUrlName:eq:{viewUrlName}".format(viewUrlName=VIEW_URL_NAME)
headers = {'X-tableau-auth':token,
           'accept': 'application/json'}

#GET /api/api-version/sites/site-id/views?filter=viewUrlName:eq:view-name
view_get_url="https://{server}/api/{version}/sites/{siteid}/views?{query}".format(
        server=TABLEAU_SERVER, version=TABLEAU_VERSION, siteid=site_id,  query= query_value)

outDataOrig = requests.get(view_get_url,headers=headers).content
outDataDecode= outDataOrig.decode()
json_out = json.loads(outDataDecode)
view_id = json_out['views']['view'][0]['id']

print('view id: {view_id}'.format(view_id=view_id))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/c294e145-a604-4cd4-9732-66c1f9c2546c.png)
⑤Tableauビューをボリュームにダウンロードする
以下の値は実際の値に置き換える
catalog
schema
volume
file_name
table_name
```
catalog =  "aibi"
schema =  "default"
volume =  "vol"

file_name ="overview.png"
table_name ="overview"
path_volume = "/Volumes/" + catalog + "/" + schema + "/" + volume + "/" + file_name
path_table = catalog + "." + schema

query_value = "resolution=high" 
headers = {'X-tableau-auth':token}
  
#GET /api/api-version/sites/site-id/views/view-id/image?vf_<fieldname>=filter-value
image_get_url="https://{server}/api/{version}/sites/{siteid}/views/{viewid}/image?{query}".format(
        server=TABLEAU_SERVER, version=TABLEAU_VERSION, siteid=site_id, viewid=view_id, query= query_value)

urlData = requests.get(image_get_url,headers=headers).content
   
with open(path_volume, mode='wb') as f:
    f.write(urlData)

print(path_volume) # Show the complete path
print(path_table) # Show the complete path
```
⑥TableauビューがDatabricksのボリュームにダウンロードされたことを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/4f12a219-26cb-44fe-9cb4-e741c6a2f6f9.png)
#### 3.TableauビューのデータをDatabricksにダウンロードし、テーブルを作成
①Tableauビューのデータをボリュームにダウンロードする
以下の値は実際の値に置き換える
data_name
```
data_name ="overview.csv"   #TODO 保存先のファイル名
data_path_volume = "/Volumes/" + catalog + "/" + schema + "/" + volume + "/" + data_name
query_value = ""
    
headers = {'X-tableau-auth':token}
  
#GET /api/api-version/sites/site-id/views/view-id/data?vf_<fieldname>=filter-value
data_get_url="https://{server}/api/{version}/sites/{siteid}/views/{viewid}/data?{query}".format(
    server=TABLEAU_SERVER, version=TABLEAU_VERSION, siteid=site_id, viewid=view_id, query= query_value)
urlData = requests.get(data_get_url,headers=headers).content  
outtext = urlData.decode()

#取得したデータを出力してみる
print(outtext)

#ファイルに出力する
with open(data_path_volume, mode='w') as f:
    f.write(outtext)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/58e49d99-180f-42c5-a471-42d7d5d7a9f8.png)
②Tableauのデータがボリュームにダウンロードされたことを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/d730f7fd-fa41-41f5-9665-f4e53eeea925.png)
③ダウンロードしたCSV データを データフレーム に読み込む
```
df = spark.read.csv(f"{data_path_volume}",
  header=True,
  inferSchema=True,
  sep=",")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/1fe111f1-c845-46f7-a44f-402e05c2aec1.png)
④列名に日本語や制約記号がある場合は、列名を変更
例：
```
df = df.withColumnRenamed("Country/Region", "Country_Region")
df = df.withColumnRenamed("State/Province", "State_Province")
df = df.withColumnRenamed("経度 (生成)", "Longitude")
df = df.withColumnRenamed("緯度 (生成)", "Latitude")
df = df.withColumnRenamed("Profit Ratio", "Profit_Ratio")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/3c21db0b-d82b-452a-9d8a-0ebe14b6ce81.png)

⑤データフレームをテーブルに保存する
```
df.write.mode("overwrite").saveAsTable(f"{path_table}" + "." + f"{table_name}")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/4d9567de-366b-4317-b427-928c66c0d3d5.png)
⑥テーブルが作成されてることを確認
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/919f782a-9fb7-4ae1-a58f-81ca2f7efa68.png)
#### 4.DatabricksのダッシュボードにTableauビューとデータを設定
①「新規」→「ダッシュボード」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/ccebd599-3c18-49e9-9813-48977be48fe9.png)
②「テキストボックスを追加」アイコンをクリックし、ダッシュボードに配置
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/e16f5613-58e9-4c93-afbc-820840c3a900.png)
③ボリュームにダウンロードしているTableauビューイメージを指定

https://docs.databricks.com/aws/ja/dashboards#-%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%E3%82%A6%E3%82%A3%E3%82%B8%E3%82%A7%E3%83%83%E3%83%88%E3%81%AB%E7%94%BB%E5%83%8F%E3%82%92%E8%BF%BD%E5%8A%A0%E3%81%99%E3%82%8B

例：
```
![Overview](https://<DatabricksのインスタンスURL>/ajax-api/2.0/fs/files/Volumes/aibi/default/vol/overview.png)
```
④外部にカーソルをクリックすると、Tableauビューのイメージがダッシュボードに表示される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/6f2e31bb-4cd4-4b00-b61f-24fa1e4f6cfc.png)
⑤ダウンロードしたTableauのデータをDatabricksのダッシュボードに追加
「データ」タブをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/d41aaf1e-6d49-4f33-8355-649f614a29ce.png)
⑥「テーブルを選択」をクリックし、手順3で作成したテーブルを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/210b2c03-ea35-4e24-863a-65e814f2674a.png)
⑦「Canvas」をクリックし、ダッシュボード画面に戻り、「ビジュアライゼーションを追加」アイコンをクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/dcc24699-b028-4a51-9af1-8b8ea0879280.png)
⑧自然言語を入力し、Enterを押すと、対応グラフが表示される、問題なければ承認をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/4169af7d-6b8d-4096-8b73-c865bdee98ee.png)
⑨「公開」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/e533c7e9-84ee-434b-8d77-28d041303b76.png)
⑩「Genie」をOnにし、「公開」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/2018713c-a966-4361-a9ea-edc0401a9c61.png)
#### 5.DatabricksのGenieを使ってみる
①「Genieに聞く」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/e7993504-e1fe-409f-9a45-c3226fe6df7c.png)
②ダッシュボードを見ながら、自然言語で質問すると、回答を得ることができる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/193f6050-e6ca-4a9f-8b1b-cd882c94d192.png)
③回答は日本語で設定することも可能
1)新規でGenieスペースを作成し、設定から日本語で回答するように指示を設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/d03debac-fe0c-4307-8b04-6eb85ef4094a.png)
2)「共有」→「リンクをコピー」をクリック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/141fbe42-eec1-4b0f-a91e-c49236da8e31.png)
3)ダッシュボードの公開から「既存のGenie spaceをリンク」を選択し、コピーしたGenieリンクを貼り付ける
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/be22d881-36a3-47f2-829d-a17430fa698e.png)
4)日本語で回答が返ってくることを確認できる
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/562390/f19270fe-5a0a-4e33-9519-46ce6891fd43.png)
5)TableauのビューをDatabricksで見ながら、自然言語でドリルダウン分析が可能

以上