1.はじめに
- GCSにアップロードしたcsvデータを、colaboratory上でBigQueryにロードする際に、エラーにぶつかる。
- 後から見るとなーんだ、という感じだけれど、ネットを探してもすぐに発見できなかったのでメモ。
2.エラー
- 公式に書いてあるコードをそのまま流用して実行。
from google.cloud import bigquery
# Construct a BigQuery client object.
client = bigquery.Client()
# TODO(developer): Set table_id to the ID of the table to create.
table_id = "your-project.your_dataset.your_table_name"
job_config = bigquery.LoadJobConfig(
schema=[
bigquery.SchemaField("name", "STRING"),
bigquery.SchemaField("post_abbr", "STRING"),
],
skip_leading_rows=1,
# The source format defaults to CSV, so the line below is optional.
source_format=bigquery.SourceFormat.CSV,
)
uri = "gs://cloud-samples-data/bigquery/us-states/us-states.csv"
load_job = client.load_table_from_uri(
uri, table_id, job_config=job_config
) # Make an API request.
load_job.result() # Waits for the job to complete.
destination_table = client.get_table(table_id) # Make an API request.
print("Loaded {} rows.".format(destination_table.num_rows))
便利―と思いつつ実行するとこんなエラーが!
NotFound: 404 POST https://bigquery.googleapis.com/bigquery/v2/projects//jobs?prettyPrint=false: Request couldn't be served.
エラー内容を調べると、load_job_from_uriのAPIコールに必要な情報が足りない。とのこと。
ドキュメントを見ると、いろいろ引数があることが判明。
ネット情報ではlocation情報が不足してるから、など言われている。
3.修正
- いくつか試したところ、こう↓やればできた。load_jobの引数にproject=~~を追加しただけ。
from google.cloud import bigquery
# Construct a BigQuery client object.
client = bigquery.Client()
# TODO(developer): Set table_id to the ID of the table to create.
# table_id = "your-project.your_dataset.your_table_name"
job_config = bigquery.LoadJobConfig(
schema=[
bigquery.SchemaField("name", "STRING"),
bigquery.SchemaField("post_abbr", "STRING"),
],
skip_leading_rows=1,
# The source format defaults to CSV, so the line below is optional.
source_format=bigquery.SourceFormat.CSV,
)
uri = "gs://cloud-samples-data/bigquery/us-states/us-states.csv"
load_job = client.load_table_from_uri(
uri, table_id, job_config=job_config,
project="your-project"
) # Make an API request.
load_job.result() # Waits for the job to complete.
destination_table = client.get_table(table_id) # Make an API request.
print("Loaded {} rows.".format(destination_table.num_rows))
変更部分を再掲。
load_job = client.load_table_from_uri(
uri, table_id, job_config=job_config,
project="your-project" ##これ
) # Make an API request.
- またはclientを作るときに
client = bigquery.Client(project="your-project")
でも行けた。単にprojectを特定するだけでよかった。