pandas-gbq からの移行

pandas-gbq ライブラリは、pandas コミュニティによるコミュニティ主導のプロジェクトです。BigQuery クライアント ライブラリ google-cloud-bigquery は、BigQuery とやり取りするための公式の Python ライブラリです。pandas-gbq ライブラリを使用している場合、すでに google-cloud-bigquery ライブラリを使用しています。pandas-gbqgoogle-cloud-bigquery で BigQuery の API を呼び出します。pandas-gbq は、pandas から BigQuery への簡単なインターフェースを提供しますが、google-cloud-bigquery ライブラリが提供する機能の多くは提供していません。

このトピックでは、Python のコードで、pandas-gbq ではなく google-cloud-bigquery を使うようにするために必要な変更点について詳しく説明します。このトピックのコードのサンプルでは、それぞれ下記のバージョンのライブラリを使います。

google-cloud-bigquery[pandas,pyarrow]==1.7.0
pandas-gbq==0.7.0

2 つのライブラリの機能レベルおよびサポートレベルの違いのうち主なものは以下のとおりです。

pandas-gbq google-cloud-bigquery
サポート PyData とボランティアが管理するオープンソース ライブラリ Google とボランティアが管理するオープンソース ライブラリ
BigQuery API の機能 クエリの実行と pandas DataFrame からテーブルへのデータ保存に限定 BigQuery API の全機能、pandas DataFrame の読み書き、Jupyter マジックによるクエリ実行
新機能のリリース サイクル ボランティアが実装したときのみ BigQuery API でリリースされたとき
ドキュメント / ソース ドキュメント / ソース

クエリの実行

どちらのライブラリも、BigQuery に保存されているデータのクエリをサポートしています。ライブラリ間の主な違いは次のとおりです。

pandas-gbq google-cloud-bigquery
デフォルトの SQL 構文 レガシー SQL 標準 SQL
クエリの構成 BigQuery REST リファレンス指定の形式で辞書として送信 QueryJobConfig クラス(さまざまな API 構成オプションのプロパティが含まれる)を使用

標準 SQL 構文を使ったデータのクエリ

次のサンプルは、プロジェクトを明示的に指定して標準 SQL クエリを実行する方法、およびは明示的に指定せずに実行する方法を示しています。どちらのライブラリでも、プロジェクトが指定されていない場合、プロジェクトはデフォルトの認証情報から決定されます。

pandas-gbq:

import pandas

sql = """
    SELECT name
    FROM `bigquery-public-data.usa_names.usa_1910_current`
    WHERE state = 'TX'
    LIMIT 100
"""

# Run a Standard SQL query using the environment's default project
df = pandas.read_gbq(sql, dialect='standard')

# Run a Standard SQL query with the project set explicitly
project_id = 'your-project-id'
df = pandas.read_gbq(sql, project_id=project_id, dialect='standard')

google-cloud-bigquery:

from google.cloud import bigquery

client = bigquery.Client()
sql = """
    SELECT name
    FROM `bigquery-public-data.usa_names.usa_1910_current`
    WHERE state = 'TX'
    LIMIT 100
"""

# Run a Standard SQL query using the environment's default project
df = client.query(sql).to_dataframe()

# Run a Standard SQL query with the project set explicitly
project_id = 'your-project-id'
df = client.query(sql, project=project_id).to_dataframe()

レガシー SQL 構文を使ったデータのクエリ

次のサンプルは、レガシー SQL 構文を使用してクエリを実行する方法を示しています。クエリを標準 SQL に更新する方法については、標準 SQL 移行ガイドをご覧ください。

pandas-gbq:

import pandas

sql = """
    SELECT name
    FROM [bigquery-public-data:usa_names.usa_1910_current]
    WHERE state = 'TX'
    LIMIT 100
"""

df = pandas.read_gbq(sql, dialect='legacy')

google-cloud-bigquery:

from google.cloud import bigquery

client = bigquery.Client()
sql = """
    SELECT name
    FROM [bigquery-public-data:usa_names.usa_1910_current]
    WHERE state = 'TX'
    LIMIT 100
"""
query_config = bigquery.QueryJobConfig(use_legacy_sql=True)

df = client.query(sql, job_config=query_config).to_dataframe()

構成を含むクエリの実行

パラメータ化クエリの実行や、クエリ結果を保存する抽出先テーブルの指定など、複雑な操作を実行するには、BigQuery API リクエストで構成を送信する必要があります。pandas-gbq では、BigQuery REST リファレンスで指定された形式の辞書として構成を送信する必要があります。google-cloud-bigquery には、QueryJobConfig などのジョブ構成クラスがあり、複雑なジョブの構成に必要なプロパティが用意されています。

次のサンプルは、名前付きパラメータを使用してクエリを実行する方法を示します。

pandas-gbq:

import pandas

sql = """
    SELECT name
    FROM `bigquery-public-data.usa_names.usa_1910_current`
    WHERE state = @state
    LIMIT @limit
"""
query_config = {
    'query': {
        'parameterMode': 'NAMED',
        'queryParameters': [
            {
                'name': 'state',
                'parameterType': {'type': 'STRING'},
                'parameterValue': {'value': 'TX'}
            },
            {
                'name': 'limit',
                'parameterType': {'type': 'INTEGER'},
                'parameterValue': {'value': 100}
            }
        ]
    }
}

df = pandas.read_gbq(sql, configuration=query_config)

google-cloud-bigquery:

from google.cloud import bigquery

client = bigquery.Client()
sql = """
    SELECT name
    FROM `bigquery-public-data.usa_names.usa_1910_current`
    WHERE state = @state
    LIMIT @limit
"""
query_config = bigquery.QueryJobConfig(
    query_parameters=[
        bigquery.ScalarQueryParameter('state', 'STRING', 'TX'),
        bigquery.ScalarQueryParameter('limit', 'INTEGER', 100)
    ]
)

df = client.query(sql, job_config=query_config).to_dataframe()

BigQuery テーブルへ pandas DataFrame を読み込む

どちらのライブラリも、pandas DataFrame から BigQuery の新しいテーブルへのデータのアップロードをサポートしています。主な違いは次のとおりです。

pandas-gbq google-cloud-bigquery
サポートされる型 DataFrame を CSV 形式に変換してから API に送信。ネストした値と配列値はサポートしません。 DataFrame を Parquet 形式に変換してから API に送信。ネストした値と配列値をサポートします。pyarrow(DataFrame のデータを BigQuery API へ送信するのに使う parquet エンジン)は、DataFrame をテーブルに読み込むためにインストールする必要があります。
読み込みの構成 BigQuery REST リファレンス指定の形式で辞書として送信 さまざまな API 構成オプションのプロパティが格納された LoadJobConfig クラスを使用します。

pandas-gbq:

import pandas

df = pandas.DataFrame(
    {
        'my_string': ['a', 'b', 'c'],
        'my_int64': [1, 2, 3],
        'my_float64': [4.0, 5.0, 6.0],
    }
)
full_table_id = 'my_dataset.new_table'
project_id = 'my-project-id'

df.to_gbq(full_table_id, project_id=project_id)

google-cloud-bigquery:

from google.cloud import bigquery
import pandas

df = pandas.DataFrame(
    {
        'my_string': ['a', 'b', 'c'],
        'my_int64': [1, 2, 3],
        'my_float64': [4.0, 5.0, 6.0],
    }
)
client = bigquery.Client()
dataset_ref = client.dataset('my_dataset')
table_ref = dataset_ref.table('new_table')

client.load_table_from_dataframe(df, table_ref).result()

pandas-gbq でサポートされていない機能

pandas-gbq ライブラリには、データのクエリやテーブルへの書き込みに役立つインターフェースがありますが、たとえば以下をはじめとする BigQuery API の機能の多くには対応していません。

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。