目的
read_gbqとhyper.apiを使って、Bigqueryのデータをtableau onlineにpublishするところまでを自動化したい。
全体の流れ
これをブラウザでなくpythonコードで行うことで自動でデータを更新できるようになる。
bqからデータを取ってくる
以下を実行する。
import pandas as pd
import numpy as np
query = 'SELECT Order_Date,Sales FROM `technolife-sandbox.ikegami.order` LIMIT 10'
#クエリを入力
# strベースのクエリと、project_id(ex: technolife-sandbox)が必要
data_frame = pd.read_gbq(query, 'technolife-sandbox')
nmp = data_frame.to_numpy().tolist()
pd.read_gbqを実行すると、ブラウザでGoogle Accountの認証画面が開きます。
該当のprojectにアクセス可能なアカウントでログインすると、連携認証が完了し、処理が開始されます。
Python使いのためのBigQuery連携 – Qiita
と書いてあったが、
Permission denied while getting Drive credentials.
とエラーがでた。
コマンドプロンプトで
$ gcloud auth application-default login \
--scopes="https://www.googleapis.com/auth/drive","https://www.googleapis.com/auth/cloud-platform"
を入力することでcredentialsファイルを入手することができた。
参考:BigQueryでGoogleドライブデータへのクエリでエラーが出るときの対処 (zenn.dev)
hyper-fileに変換して、tableauonline にpublishする。
hyperapiをインストールする。
Hyper API 0.0.14751 (tableau.com)からダウンロードします。
今回はpythonを使用します。
Hyper API (Python-.whl)をダウンロードしたディレクトリで
pip install tableauhyperapi-0.0.8707-py3-none-win_amd64.whl
を入力し、モジュールをインストール。
アクセストークンの作成。
を参考にアクセストークンを作成する。
pythonのコード作成
hyper-api-samples/Community-Supported/publish-hyper at main · tableau/hyper-api-samples (github.com)
を参考にpublish.pyを作成する。
publish-hyper-file.pyの10行目に上のbqからとってくるコードを入力。
publish-hyper-file.pyの14行目 hyper_name = ‘hyperファイルの名前(任意)’
publish-hyper-file.pyの15行目 server_address = ‘https://10ax.online.tableau.com/’は自身のサイトのものを
publish-hyper-file.pyの16行目 site_name = ‘mysitename’ も自身のサイトのものを入力。
publish-hyper-file.pyの17行目 project_name = ‘ファイルを挿入したいプロジェクト名’
publish-hyper-file.pyの18行目 token_name = ‘作成したトークンの名前’
publish-hyper-file.pyの19行目 token_value = ‘作成したトークンの中身’
publish-hyper-file.pyの29行目のcolumnsの中ににhyper-fileのカラムを入力。
ex)customer Id (string) をカラムにしたいときは
TableDefinition.Column(name='Customer ID', type=SqlType.text(), nullability=NOT_NULLABLE)
publish-hyper-file.pyの60行目から63行目を
data_to_insert = tmp
に書き換える。
エラーが出る場合
カラムの型が違っている可能性が高い。
#SqlType.double()=小数
#SqlType.big_int()=整数
#SqlType.text()=文字列
#SqlType.date()=日付
最後に
今回実装したシステムは個人情報が多く、わかりやすい画像などを出すことができなかった。
DMP構築のご相談
お気軽にお問い合わせください