PythonからBigQueyへ列名とデータ型指定なしでアップロードする方法
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の方が参照されてしまうので注意が必要です。