質問するログイン新規登録
BigQuery

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Google Cloud Run

Google Cloud Runは、GCPで提供されるフルマネージドのサーバーレスプラットフォームです。コンテナ型アプリの構築、デプロイを容易に行うことが可能です。

Q&A

0回答

129閲覧

Cloud Run Functionsを使ってBigQueryを操作したいのですが、エラーが出て解決しません。

itcompass

総合スコア0

BigQuery

BigQueryは、Google Cloud Platformが提供しているビッグデータ解析サービス。数TB(テラバイト)またはPB(ペタバイト)の膨大なデータに対し、SQL風のクエリを実行し、高速で集計・分析を行うサービスです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Google Cloud Run

Google Cloud Runは、GCPで提供されるフルマネージドのサーバーレスプラットフォームです。コンテナ型アプリの構築、デプロイを容易に行うことが可能です。

0グッド

1クリップ

投稿2025/07/10 04:59

0

1

実現したいこと

Cloud Run Functionsを使って、Cloud StorageへCSVはアップロードをトリガーとして、CSV内容をBigQueryにインポートしたい。

発生している問題・分からないこと

引数contextにデータが入らないとなってしまいます。

エラーメッセージ

error

1TypeError: process_csv_to_bigquery() missing 1 required positional argument: 'context'

該当のソースコード

Python

1import pandas as pd 2from google.cloud import bigquery, storage 3from io import StringIO 4import os 5import datetime 6 7def process_csv_to_bigquery(event, context): 8 """ 9 Google Cloud Storageにファイルがアップロードされた際にトリガーされる関数。 10 CSVを読み込み、データを整形し、BigQueryに挿入します。 11 """ 12 13 file_name = event['name'] 14 bucket_name = event['bucket'] 15 16 print(f"Processing file: {file_name} from bucket: {bucket_name}") 17 18 # CSVファイル以外はスキップ 19 if not file_name.endswith('.csv'): 20 print(f"Skipping non-CSV file: {file_name}") 21 return 22 23 # GCSからCSVファイルを読み込む 24 storage_client = storage.Client() 25 bucket = storage_client.get_bucket(bucket_name) 26 blob = bucket.blob(file_name) 27 csv_data = blob.download_as_string().decode('utf-8') 28 29 # pandasでCSVデータをDataFrameとして読み込む 30 df = pd.read_csv(StringIO(csv_data)) 31 32 # 日付形式の整形 (年/月/日 -> 年-月-日) とデータ型をDATEにする 33 if '日付' in df.columns: 34 # まずPandasのdatetime型に変換。変換できない値はNaT(Not a Time)にする 35 df['日付'] = pd.to_datetime(df['日付'], format='%Y/%m/%d', errors='coerce') 36 # NaTではない有効な日付のみをdatetime.dateオブジェクトに変換し、文字列化 37 # BigQueryのDATE型として挿入するために 'YYYY-MM-DD' 形式の文字列にします。 38 df['日付'] = df['日付'].dt.date.astype(str) 39 # NaTだった場合はNaNになるので、BigQueryに挿入される際にNULLとして扱われます。 40 41 # 時間形式の整形 (hh:mm -> hh:mm:ss) とデータ型をTIMEにする 42 time_columns = ['支払開始時間', '支払終了時間', '請求開始時間', '請求終了時間'] 43 for col in time_columns: 44 if col in df.columns: 45 # NaN値ではない、かつ形式が 'HH:MM'(長さ5)の場合に ':00' を追加 46 df[col] = df[col].astype(str).apply(lambda x: x + ':00' if pd.notna(x) and len(x) == 5 else x) 47 48 # BigQueryのTIME型として挿入するため、datetime.timeオブジェクトに変換を試みます。 49 # 変換できない場合はNaTになり、最終的にNULLとして扱われます。 50 df[col] = df[col].apply(lambda x: datetime.datetime.strptime(x, '%H:%M:%S').time() if pd.notna(x) and len(x) == 8 else None) 51 # BigQueryのTIME型は 'HH:MM:SS' 形式の文字列も受け入れることが多いですが、 52 # datetime.time オブジェクトに変換することでより厳密に型を扱えます。 53 54 # BigQueryクライアントの初期化 55 bigquery_client = bigquery.Client() 56 57 # BigQueryプロジェクトID、データセットID、テーブルIDを設定 58 # ここをあなたのBigQueryのデータセットIDとテーブルIDに置き換えてください。 59 project_id = bigquery_client.project # BigQueryクライアントが自動的にプロジェクトIDを検出 60 dataset_id = 'canvas-eye-465212-q8.zinzai_test_date' # 例: 'my_dataset' **ここをあなたのデータセットIDに置き換えてください** 61 table_id = 'canvas-eye-465212-q8.zinzai_test_date.worklog' # 例: 'my_table' **ここをあなたのテーブルIDに置き換えてください** 62 63 table_ref = bigquery_client.dataset(dataset_id, project=project_id).table(table_id) 64 65 # BigQueryから既存データの削除 (CSVに含まれる日付の最小値と最大値に該当するデータ) 66 # CSVに「日付」カラムがあり、かつデータが存在する場合のみ削除処理を実行 67 if '日付' in df.columns and not df['日付'].empty: 68 # 有効な日付データ(NaNではないデータ)のみを考慮 69 valid_dates_in_csv = df['日付'].dropna() 70 if not valid_dates_in_csv.empty: 71 min_date_str = valid_dates_in_csv.min() 72 max_date_str = valid_dates_in_csv.max() 73 74 # BigQueryのDATE型カラムに対して日付範囲でDELETEを実行 75 delete_query = f""" 76 DELETE FROM `{project_id}.{dataset_id}.{table_id}` 77 WHERE 日付 BETWEEN PARSE_DATE('%Y-%m-%d', '{min_date_str}') AND PARSE_DATE('%Y-%m-%d', '{max_date_str}') 78 """ 79 print(f"Executing delete query: {delete_query}") 80 try: 81 query_job = bigquery_client.query(delete_query) 82 query_job.result() # クエリの完了を待機 83 print(f"Successfully deleted existing data in BigQuery for dates between {min_date_str} and {max_date_str}.") 84 except Exception as e: 85 print(f"Error during BigQuery delete operation: {e}") 86 # 削除に失敗しても、データ挿入は試みます。必要に応じてここで処理を中断することも可能です。 87 else: 88 print("No valid '日付' found in the CSV for deletion range. Skipping deletion.") 89 else: 90 print("CSV does not contain '日付' column or it is empty. Skipping deletion.") 91 92 # BigQueryへのデータ挿入 93 # DataFrameを辞書のリストに変換します。BigQueryのスキーマとカラム数・並び順が完全に一致しているため、 94 # BigQueryの insert_rows_json メソッドが最もシンプルで効果的です。 95 rows_to_insert = df.to_dict(orient='records') 96 97 print(f"Attempting to insert {len(rows_to_insert)} rows into BigQuery table: {table_id}") 98 errors = bigquery_client.insert_rows_json(table_ref, rows_to_insert) 99 100 if errors: 101 print("Encountered errors while inserting rows:") 102 for error in errors: 103 print(f" {error}") # エラーの詳細を表示 104 raise Exception("BigQuery insert failed. Check logs for details.") # 挿入に失敗したら関数を終了させる 105 else: 106 print(f"Successfully inserted {len(df)} rows into BigQuery table: {table_id}") 107 108 print("CSV processing and BigQuery insertion complete.")

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

Pythonのバージョン変更などをしましたが、なぜ間違っているか全くわからず・・・。

補足

色々調べた結果にたどり着いたコードですが、考え方自体が間違っている場合は、教えて頂きたいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

68user

2025/07/10 10:11

これって第一世代 (gen1) の書き方なような気がしますが、今作るなら第二世代 (gen2) でよいでしょう。 最初は下記を見ながら Hello world から始めるのがよいのでは。 https://cloud.google.com/run/docs/write-http-functions?hl=ja 動かない場合はソースに加えてデプロイ方法も提示してください。
itcompass

2025/07/23 07:14

コメントありがとうございます。確かに、第1世代になっていました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問