BigQueryのテーブル作成実践(外部データソース参照: Google Cloud Storage)

2020.03.17

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Google BigQueryでは、テーブル作成を行う術が複数提供されています。当エントリではその中から「外部データソース参照」による作成方法について、Google Cloud Storageに格納したCSVデータを用いた実践を交えて見ていきたいと思います。

目次

 

コンソール経由で実践

今回の手順では、予めGCS(Google Cloud Storage)の所定のバケットにデータをアップロードしておきます。フォルダ毎取り込む形を想定していましたので、以下の形で複数ファイル用意しました。

テーブル作成メニューにて、「Google Cloud Storage」を選択。

対象ファイル指定で、前述のGCSアップロード済ファイルを選択。ここでは一度、任意のファイルを選択しておきます。

外部データソースの場合、ワイルドカード指定(*)でのファイル指定が可能です。ここではその形式を取り、任意のフォルダ配下のファイルを使ってテーブルを作成する手順としました。

その他の指定内容については「ローカルファイルを用いたテーブル作成」と同様のため、割愛します。「テーブルを作成」を押下。

作成内容(テーブルカラム定義):

作成内容(詳細):

作成内容(プレビュー内容):ここでは取り込まれている件数を確認する事が出来ます。

いずれもヘッダ行を含むファイル。件数的にも「合算値-2(ヘッダ行分)」で合致しています。

% wc movies-small.csv 
    9743   41955  494431 movies-small.csv
% wc movies-25m.csv 
   62424  274913 3038099 movies-25m.csv

 

CLIで実践(bq load)

CLI(bq load)を用いた作成方法。こちらもローカルファイルアップロード時のものとほぼ変わらず、ファイル指定箇所がgcs上のものに変えることで実行する事が出来ました。自動検出(--autodetect)を用いた例:

$ bq load --autodetect \
 --location=asia-northeast1 \
 --source_format=CSV \
 cmbqdataset.bqtable_from_gcs_autodetect \
 gs://xxxxxxxxxxxxxxxxxx-tokyo/datasets/movielens/*

Waiting on bqjob_rxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_1 ... (3s) Current status: DONE

カラムスキーマ定義を指定した例:

$ bq load \
 --location=asia-northeast1 \
 --source_format=CSV \
 --skip_leading_rows 1 \
 cmbqdataset.bqtable_from_localfile_def_schema \
 gs://xxxxxxxxxxxxxxxxxx-tokyo/datasets/movielens/* \
movieId:INTEGER,title:STRING,genres:STRING

Waiting on bqjob_rxxxxxxxxxxxxxxxxxxxxxxxxxxxxx_1 ... (1s) Current status: DONE

 

クライアントライブラリ(Python)で実践

クライアントライブラリ(Python)での実行内容は以下の通り。サンプルコードではカラムスキーマの指定を行っています。追加でNOT NULL指定も設定してみました。

create-table-from-gcs.py

from google.cloud import bigquery
client = bigquery.Client()
dataset_id = 'cmbqdataset'

dataset_ref = client.dataset(dataset_id)
job_config = bigquery.LoadJobConfig()
job_config.schema = [
    bigquery.SchemaField("movieId", "INT64", mode='REQUIRED'),
    bigquery.SchemaField("title", "STRING", mode='REQUIRED'),
    bigquery.SchemaField("genres", "STRING"),
]
job_config.skip_leading_rows = 1
# The source format defaults to CSV, so the line below is optional.
job_config.source_format = bigquery.SourceFormat.CSV
uri = "gs://xxxxxxxxxxxxxxxxxxx-tokyo/datasets/movielens/*"

load_job = client.load_table_from_uri(
    uri, dataset_ref.table("bqtable_from_gcs_python"), job_config=job_config
)  # API request
print("Starting job {}".format(load_job.job_id))

load_job.result()  # Waits for table load to complete.
print("Job finished.")

destination_table = client.get_table(dataset_ref.table("bqtable_from_gcs_python"))
print("Loaded {} rows.".format(destination_table.num_rows))

実行結果:

$ python create-table-from-gcs.py 
Starting job xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
Job finished.
Loaded 72165 rows.

 

まとめ

という訳で、BigQueryのテーブル作成を外部データソース(Google Cloud Storage)経由で実践してみた内容のまとめでした。

基本的にはローカルファイルと同じ扱いで取り扱い出来るのは楽で良いですね。設定出来る内容の詳細度合い・幅広さからするとクライアントライブラリを使用するのが好ましい様な気がしますが、この辺は実際のユースケースを踏まえて御判断頂くのが宜しいのではないかと思いました。