FLINTERS Engineer's Blog

FLINTERSのエンジニアによる技術ブログ

BigQueryの一時テーブル活用法

こんにちは、湯上です。
こちらはFLINTERSで開催中の「梅雨にも負けないブログ祭り」企画の記事です。 テーマは #技術 です。
BigQueryの一時テーブルについて説明します。

BigQuery APIでの一時テーブル自動作成

BigQueryを利用してデータを挿入する際に宛先テーブルを指定しなかった場合、結果は自動的に作成される一時テーブルに格納されます。
ここでいう宛先テーブルとは REST APIでいうJobConfigurationQueryのdestinationTable、 PythonライブラリでいうQueryJobConfigのdestinationです。
この一時テーブルはアクセス可能なユーザーが限られ、一定期間後自動的に削除されるため使いやすいです。

一時テーブルの仕様とメリット

一時テーブルについての公式ドキュメントはこちらです。
https://cloud.google.com/bigquery/docs/writing-results

一部を抜粋します。

クエリの終了後、一時テーブルは最大 24 時間存在します。
一時テーブルデータへのアクセスは、クエリジョブを作成したユーザーまたはサービス アカウントに限定されます。
一時テーブルは共有できず、標準のリストやその他のテーブル操作の方法を使用して表示することもできません。一時テーブルは、クエリ対象の 1 つまたは複数のテーブルと同じリージョンに作成されます。

これらの特徴は結果を長期間残したくないデータを集計する場合などに有用で、毎度宛先テーブルに対して有効期限やアクセス制御の設定などをする手間を省くことができます。 不要なテーブルをうっかり消し忘れて保管料金をとられてしまう心配もありません。

実装例

以下BigQuery APIのPythonクライアントを使用して一時テーブルを作成する例です。
宛先を指定しなければいいだけなので、とてもシンプルです。

from google.cloud import bigquery

# BigQueryクライアントを作成
client = bigquery.Client()

# クエリを定義
query = """
    SELECT name, age
    FROM `project.dataset.table`
    WHERE age > 30
"""

# クエリを実行
query_job = client.query(query)

# クエリ結果を取得
results = query_job.result()

# 一時テーブル名の取得
temporary_table_name = query_job.destination.table_id

# 結果を表示
print(f"Temporary table name: {temporary_table_name}")
for row in results:
    print(f"name: {row['name']}, age: {row['age']}")

一時テーブルは結果取得後、QueryJob.destinationでTableReferenceが参照できるようになります。

まとめ

BigQueryの一時テーブルはクエリ実行時に自動的に作成され、効率的に中間結果を保存するための強力なツールです。適切に利用することでより効率的なシステムを構築することが可能です。
私のチームではサブクエリの結果をサンプリングしたい場合に一時テーブルに保存するというケースで利用しています。
皆さんもぜひ活用してみてくださいね。