4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[GCF+Python]ExcelをGCSにアップしてBigQueryに新規テーブルを作成する方法

Posted at

#目的
非エンジニアの企画職やマーケ職などが自身でBigQueryにデータアップロードできるツールを提供したい & 自分自身が普段エクセルのデータをBigQUeryにアップロードするのが面倒だったりするので、GUIで操作できるように作りました。

#想定する挙動

  1. Cloud Storageにエクセル(.xlsxもしくは.csv)をアップロードする。
    ※GCSのディレクトリ名がBigQueryのデータセット名となり、ファイル名がテーブル名になるようにpathを作る
    .xlsx GS://バケット名(任意)/dataset名/table名.xlsx
    .csv GS://バケット名(任意)/dataset名/table名.csv

2.GCSのアップロードがトリガーとなり、GCFが動く。
3.BigQueryに新規テーブルが作成される。
(※既に同じテーブル名がある場合、上書きされる)

#準備

  • Google Cloud Storage

データアップロード対象のバケットを作成する

  • Google Cloud Functions

以下の設定を行う(詳細は割愛)
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']))
4
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?