Closed24

Cloud Storage から BigQuery に csv を流したい

nbstshnbstsh

外部のデータを csv に export した上で BigQuery に流したい。
ざっと調べたところ、csv ファイルを Cloud Storage に置いて、BigQuery に流すのが良さげなので具体的な方法をメモしていく。

いくつか方法があるみたいなので、

  • シンプルでサクッと実現できる
  • 一連の処理を自動化できる
  • できる限りコストを抑えたい

この辺の要件を満たす方法を探す。

nbstshnbstsh

一旦 Console から手動でやってみる

まず、Console から手動で BigQuery に CloudStorage の csv をアップロードしてみる

nbstshnbstsh

Storage の csv から Table 作成

"Create Table" から入力フォームを開く。

Source

  • Google Cloud Storage
  • bucket は先ほど作成したものを選択
  • file は先ほどアップロードしたものを選択
  • File Format は CSV

Destination

  • dataset は先ほど作成したものを選択
  • Table Name は適当に入力

nbstshnbstsh

これだと自動化できないので次は Node.js でやってみる

nbstshnbstsh

TypeScript で Storage から BigQuery に csv を流す

とりあえず ts の setup

npm install --save-dev typescript tsx
npx tsx --init
package.json
  "scripts": {
    "dev": "tsx index.ts"
  }
index.ts
console.log('Hello World!');

実行

npm run dev
// Hello World!

準備完了

nbstshnbstsh

install dependencies

@google-cloud/bigquery, @google-cloud/storage をインストール

npm install --save @google-cloud/bigquery @google-cloud/storage
nbstshnbstsh

サンプルコードをもとに実装

わかりやすいように table 名を users_from_ts にしておく

index.ts
import { BigQuery, JobLoadMetadata } from '@google-cloud/bigquery';
import { Storage } from '@google-cloud/storage';

const bigquery = new BigQuery();
const storage = new Storage();

// Storage の情報
const BUCKET_NAME = 'gcp-bigquery-sample';
const CSV_FILE_NAME = 'users.csv';
// BigQuery の情報
const DATASET_ID = 'cloud_storage_sample';
const TABLE_ID = 'users_from_ts';

async function loadCSVFromGCS() {
  // Imports a GCS file into a table with manually defined schema.

  // Configure the load job. For full list of options, see:
  // https://cloud.google.com/bigquery/docs/reference/rest/v2/Job#JobConfigurationLoad
  const metadata: JobLoadMetadata = {
    sourceFormat: 'CSV',
    skipLeadingRows: 1,
    autodetect: true,
  };

  // Load data from a Google Cloud Storage file into the table
  const [job] = await bigquery
    .dataset(DATASET_ID)
    .table(TABLE_ID)
    .load(storage.bucket(BUCKET_NAME).file(CSV_FILE_NAME), metadata);

  // load() waits for the job to finish
  console.log(`Job ${job.id} completed.`);

  // Check the job's status for errors
  const errors = job.status?.errors;
  if (errors && errors.length > 0) {
    throw errors;
  }
}

loadCSVFromGCS().catch(console.error);
nbstshnbstsh

実行

script を実行

npm run dev

確認

users_from_ts table が作成されていることを確認!

nbstshnbstsh

あとはこの処理を Cloud Scheduler に乗っけてあげれば、定期的に csv を BigQuery に流せるようになるな

nbstshnbstsh

BigQuery Data Transfer Service を使ってみる

The BigQuery Data Transfer Service for Cloud Storage allows you to schedule recurring data loads from Cloud Storage to BigQuery.

Cloud Storage から BigQuery への定期的なデータロードをスケジュールすることができるサービス

これを使えば自前でコード書かずに定期読み込みが実現できそう

https://cloud.google.com/bigquery/docs/cloud-storage-transfer

nbstshnbstsh

試してみる

BigQuery > Data transfers から "CREATE TRANSFER" を選択

初回の場合は、BigQuery Data Transfer API を有効化する

新規 Transfer を作成していく

nbstshnbstsh

エラー出た

Error code 5 : Not found: Table playground-387d6:cloud_storage_sample.users_transfered

Unlike individual loads of data from Cloud Storage to BigQuery, for ongoing transfers you must create the destination table before setting up the transfer. For CSV and JSON files, you must also define the table schema in advance. BigQuery cannot create the table as part of the recurring data transfer process.

事前に table を作成しておく必要があるみたい。
尚且つ、schema も定義しておかないといけないとのこと。

nbstshnbstsh

再度実行

"RUN TRANSER NOW" ボタンからいつでも手動実行できるので、再度実行する

成功!

ちゃんと table にデータが反映されていることも確認

nbstshnbstsh

事前に table と schema を作成しなければならない (= autodetection が使えない) 点を除けば、コードを書かなくて済むのでだいぶ楽ではある

nbstshnbstsh

料金

無料!
Cloud Storage からの Transfer の場合は料金かからない

  1. After data is transferred to BigQuery, standard BigQuery storage and query pricing applies. For additional pricing details, contact Sales.

ただし、読み込んだ後に関しては一般的な BigQuery の課金体系に従い料金はかかる

https://cloud.google.com/bigquery/pricing#bqdts

このスクラップは2023/07/21にクローズされました