#目的
非エンジニアの企画職やマーケ職などが自身でBigQueryにデータアップロードできるツールを提供したい & 自分自身が普段エクセルのデータをBigQUeryにアップロードするのが面倒だったりするので、GUIで操作できるように作りました。
#想定する挙動
-
Cloud Storageにエクセル(.xlsxもしくは.csv)をアップロードする。
※GCSのディレクトリ名がBigQueryのデータセット名となり、ファイル名がテーブル名になるようにpathを作る
.xlsxGS://バケット名(任意)/dataset名/table名.xlsx
.csvGS://バケット名(任意)/dataset名/table名.csv
2.GCSのアップロードがトリガーとなり、GCFが動く。
3.BigQueryに新規テーブルが作成される。
(※既に同じテーブル名がある場合、上書きされる)
#準備
データアップロード対象のバケットを作成する
以下の設定を行う(詳細は割愛)
Python 3.7
トリガーのタイプ : Cloud Storage
バケット : 上記で作成したGCSのバケット
#GCF
requestments.txt
pandas
pandas-gbq
google-cloud-storage
google-cloud-bigquery
xlrd
main.py
from google.cloud import storage
from google.cloud import bigquery
import pandas as pd
import re
def gsc_to_bigquery_createtable(data, context):
# log
print(data)
print(context)
print('Folder Name : {}'.format(data['name']))
GETPATH = data['name']
m = re.match(
r'(?P<getDatasetId>.*)/(?P<getFileId>.*)\.(?P<getFileType>.*)',
GETPATH)
# バケット名とプロジェクト名を指定する
BUCKET = 'バケット名'
PROJECT_ID = 'プロジェクト名'
# データセット名を取得
DATASET_ID = m.group('getDatasetId')
# ファイル名を取得
FILE_ID = m.group('getFileId')
# 識別子を取得
FILE_TYPE = m.group('getFileType')
TMP_PATH = '/tmp/' + FILE_ID + '.' + FILE_TYPE
# GSCからpythonへデータインポート
gcs = storage.Client(PROJECT_ID)
bucket = gcs.get_bucket(BUCKET)
blob = bucket.get_blob(GETPATH)
blob.download_to_filename(TMP_PATH)
# 識別子の条件分岐
if FILE_TYPE == 'xlsx':
df = pd.read_excel(TMP_PATH)
elif FILE_TYPE == 'csv':
df = pd.read_csv(TMP_PATH)
# pythonからBigQueryへテーブル作成
full_table_id = DATASET_ID + '.' + FILE_ID
df.to_gbq(full_table_id, project_id=PROJECT_ID, if_exists='replace')
# log
print('Folder Name : {}'.format(data['name']))