Lookerのユーザー属性をBigQueryのユーザー情報をもとに変更してみた
投稿者:杉山
こんにちは、日本情報通信の杉山です。
本投稿はNI+C TeamGCP Advent Calendar 2023の15日目の記事でございます。
遂に今回は『Looker API特集』第5弾!これまでに投稿した『Looker API特集』の集大成として、Lookerのユーザー属性をBQのユーザー情報をもとに変更した結果をご紹介できればと思います。
Looker API特集:過去のブログはこちら
目次
- 前提
- BigQuery APIへの接続方法
- コード内容説明
- 使用しているメソッド
- まとめ
前提
本稿ではLooker APIの操作でPythonを用いた方法をご紹介します。(Python 3.9.7)
Looker API SDKの使用方法はこちらをご参照ください。
BigQuery APIへの接続方法
Pythonの環境からBQへアクセスを行います。
以下のコードをローカルの.pyファイルに記載します。
#BQをインポート
from google.cloud import bigquery
# BQの環境構築
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = "xxxx.json"
client = bigquery.Client(project="xxxxx")
- 補足:”xxxx”に記載するのは以下の通り
- os.environ[‘GOOGLE_APPLICATION_CREDENTIALS’] = “xxxx.json”
- “xxxx”にはGCPのIAMと管理>サービスアカウント>詳細を管理>[キー]タブ>[鍵を追加]でダウンロードされるjsonファイルを記載
- client = bigquery.Client(project=”xxxxx”)
- “xxxxx”には使用するGCPのプロジェクト名を記載
- os.environ[‘GOOGLE_APPLICATION_CREDENTIALS’] = “xxxx.json”
コード内容説明
今回は下記のように、「BQ側にあるユーザー情報とLooker側にあるユーザー属性の情報に相違がある場合、Looker側のユーザー属性を変更できるのか」検証していきたいと思います。
- BQ側にある情報:ユーザー情報
- Looker側にある情報:ユーザー属性
これまでのブログで紹介しているLooker APIの認証やSDKのインストールに関しては本稿では省略します。
import looker_sdk
import os
from looker_sdk.sdk.api40.models import models as mdls
import pandas as pd
os.environ['GOOGLE_APPLICATION_CREDENTIALS'] = "xxxx"
client = bigquery.Client(project="xxxxx")
URL = 'https://xxxxxxxx.jp.looker.com:19999'
CLIENT_ID = 'xxxxxxxx'
CLIENT_SECRET = 'xxxxxxxxxx'
def init_looker_sdk(
url: str,
client_id: str,
client_secret: str) -> looker_sdk.methods40.Looker40SDK:
os.environ['LOOKERSDK_BASE_URL'] = url
os.environ['LOOKERSDK_CLIENT_ID'] = client_id
os.environ['LOOKERSDK_CLIENT_SECRET'] = client_secret
os.environ['LOOKERSDK_VERIFY_SSL'] = 'true'
os.environ['LOOKERSDK_TIMEOUT'] = '120'
os.environ['LOOKERSDK_API_VERSION'] = '4.0'
return looker_sdk.init40()
sdk = init_looker_sdk(URL, CLIENT_ID, CLIENT_SECRET)
①BQから社員のメールアドレスとエリア情報を取得(xxxxにはBQプロジェクト名.データセット名.テーブル名を記載)
query = “””
SELECT email,area
FROM `xxxx`
“””
query_job = client.query(query)
①-1:BQにある社員の情報をリスト化
①-1-1:メールアドレスをリスト化
bq_email = []
for row in query_job:
bq_email.append(row.email)
①-1-2:所属エリアをリスト化
bq_area = []
for row in query_job:
bq_area.append(row.area)
①-2:BQの情報をデータフレーム化
bq_info = pd.DataFrame((zip(bq_email, bq_area)), columns=[‘Email’, ‘Area’])
②全てのLookerユーザー情報を取得
users = sdk.all_users()
②-1:Lookerにあるユーザーの情報をリスト化
②-1-1:user_idをリスト化
looker_user_id = []
for val in users:
looker_user_id.append(val.id)
②-1-2:user_emailをリスト化
looker_user_email = []
for val in users:
looker_user_email.append(val.email)
②-2:Lookerの情報をデータフレーム化
Looker_info = pd.DataFrame((zip(looker_user_email, looker_user_id)), columns=[‘Email’, ‘ID’])
③BQとLookerのデータフレームをmerge
③-1:BQとLookerの情報をデータフレーム化したものをEmailをキーとして内部結合
bq_looker = pd.merge(bq_info, Looker_info, on=’Email’)
④Lookerのユーザー属性を取得
④-1:areacodeをリスト化
looker_areacode = []
④-2:user_attributesをリスト化
looker_user_attributes = []
④-3:user_idとユーザー属性を取得(user_attributes[15]の15は、Get User Attribute Valuesメソッドを使用した場合に0から数えた時のareacodeの要素番号を記載)
for userid in looker_user_id:
user_attributes = sdk.user_attribute_user_values(user_id=userid)
looker_user_attributes.append(user_attributes)
areacode = user_attributes[15]
looker_areacode.append(areacode[‘value’])
④-4:Lookerのuser_idとLookerのユーザー属性(areacode)をデータフレーム化
Looker_id_area = pd.DataFrame((zip(looker_user_id, looker_areacode)), columns=[‘ID’, ‘AREACODE’])
⑤bq_lookerとLooker_id_areaをidでmerge
df = pd.merge(bq_looker, Looker_id_area, on=’ID’)
⑥データフレーム化したArea列とID列をリスト化
df_bq_area = df[‘Area’].to_list()
df_looker_userid = df[‘ID’].to_list()
for userid, area in zip(df_looker_userid, df_bq_area):
response = sdk.set_user_attribute_user_value(
user_id=userid,
user_attribute_id=”16″,
body=mdls.WriteUserAttributeWithValue(
value=area
)
)
⑦bool型でBQ側のエリアとLooker側のエリア情報を照合
df[‘match’] = (df[‘Area’] == df[‘AREACODE’])
⑦-1:Trueを1、Falseを0でマッピング
df[‘match’] = df[‘match’].astype(int)
print(df)
①の段階ではBQのAreaとLookerのAREACODEに相違がありましたが、⑦までの手順によってLookerのユーザー属性をBQの情報に変更することが出来ました!
使用しているメソッド
- ユーザーの属性をuser_idを指定して取得(Get User Attribute Values)
response = sdk.user_attribute_user_values(user_id=”xx”)
print(response) - ユーザーの属性をuser_idとuser_attribute_idを指定し、bodyにvalueを記載して設定(Set User Attribute User Value)
response = sdk.set_user_attribute_user_value(
user_id=”xx”,
user_attribute_id=”xx”,
body=mdls.WriteUserAttributeWithValue(
value=”xx”
)) - json表記でも可
body=WriteUserAttributeWithValue(
body={“value”:”xx”}
))
まとめ
部署などをツールごとに登録する場合、どうしても登録する作業が手作業になり、時間がかかる。。。といったお悩みを持つ方が多いのではないかと思います。しかし、Lookerでは上記の方法を用いることで、ツールごとに部署などを登録するといった手間が省けます。またメンテナンスの際に一括変更したい場合も、今回の方法であればBQにデータを持つことで可能です!もちろん部署以外でも使える場面があると思うので、是非お試しください^^
最後に
本稿をご覧頂き、ありがとうございました。
秋からスタートした『Looker API特集』はいかがでしたでしょうか?
今後もLookerに限らず、皆様にとって何かお役立ちできる内容を発信していきたいと思いますのでご期待ください^^