データ分析
2024/01/31
上野 桃香

PythonからBigQueyへ列名とデータ型指定なしでアップロードする方法

logo_Python

PythonからpandasデータをBigQueryにアップロードする際の列名とデータ型の指定が煩わしい課題に対する解決策を出しました!コードの例を交えながら、この問題を効率的に解決する方法を紹介します。これにより、BigQueryへのデータの移行がよりスムーズで効率的なものとなるでしょう。

導入 はじめに

Pythonからpandas型のデータをBigQueryにアップロードするときに、列名の指定とデータ型の指定をするのがめんどくさくないですか?


今回はその問題を解消するコードを作成しました(with ChatGPT)!


これでかなり時短できたので是非使ってみて下さい。

条件 GCPのVertex AI Workbenchで開発

環境はGCPのVertex AI Workbenchです。


この環境以外だとBigQueryへの認証の時に別の手順を踏まなくてはいけません。


しかし、GCPのVertex AI のワークベンチだとめちゃくちゃ接続が楽です!これがGCPで開発するメリットの一つですね。

方法 PythonからBigQueyへ列名とデータ型指定なしでアップロードするコード


from google.cloud import bigquery
import pandas as pd

def upload_df_to_bigquery(df, destination_table, project_id):
client = bigquery.Client()

# Get DataFrame dtypes
dtypes = df.dtypes.reset_index()

# Convert pandas dtypes to BigQuery schema
schema = [bigquery.SchemaField(name, _pandas_type_to_bq_type(dtype)) for name, dtype in zip(dtypes['index'], dtypes[0])]

# Specify job configuration
job_config = bigquery.LoadJobConfig(
schema=schema,
write_disposition='WRITE_TRUNCATE' # Options: 'WRITE_TRUNCATE', 'WRITE_APPEND', 'WRITE_EMPTY'
)

# Upload DataFrame to BigQuery
client.load_table_from_dataframe(df, destination_table, job_config=job_config).result()

print('完了')

def _pandas_type_to_bq_type(pandas_type):
if pandas_type == 'object':
return 'STRING'
elif pandas_type == 'Int64':
return 'INT64'
elif pandas_type == 'float64':
return 'FLOAT64'
elif pandas_type == 'bool':
return 'BOOL'
elif pandas_type == 'datetime64[ns]':
return 'TIMESTAMP'
else:
return 'STRING' # Default to STRING if unknown type

your_dataframe = pd.read_csv('csvの名前')
project_id = 'プロジェクトID'
table_id = 'テーブルID'

# Example usage:
# Replace 'your_project_id', 'your_dataset.your_table', 'your_dataframe', and 'path/to/your/credentials.json' with actual values.
upload_df_to_bigquery(your_dataframe,table_id, project_id)

upload_df_to_bigquery関数にて、アップロードしたいデータの場所を指定して下さい。


その次に_pandas_type_to_bq_type関数でpandasのデータ型を自動でBigQuery用に書き換えてくれます!しかし、このデータ型にないものは変換できませんので、適宜必要なものは追加して下さい。


結論 まとめと注意点

上のコードをコピー&ペーストするだけでちゃちゃっとアップロードできます!


もし上のデータ型の指定だけで不十分な場合は拡張して下さい。


注意点としてはpandasで指定しているデータ型とBigQueryで保存したいときのデータ型が異なる時はpandasの方が参照されてしまうので注意が必要です。

New call-to-action