0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Cloud Functions(PHP)を使用して、CSVファイルのデータをBigQueryへ転送する

Last updated at Posted at 2022-08-03

はじめに

CloudFunction(PHP)を使用して、Cloud Storage内に配置したCSVファイルのデータをBigQueryへ転送する方法をまとめました。

CSVファイルのデータは前回の記事の方法で用意しました。
Cloud Functions(PHP)を使用して、Cloud SQLのデータをCloud Storageへ転送する

使用サービス

  • Cloud Functions
  • Cloud Storage
  • BigQuery

やろうとしていること

  • Cloud Storageに配置したCSV読み込み → BigQuery転送

ソース

Function 2
use Google\CloudFunctions\CloudEvent;
use Google\Cloud\Storage\StorageClient;
use Google\Cloud\BigQuery\BigQueryClient;
use Google\Cloud\Core\ExponentialBackoff;

function function2(CloudEvent $cloudevent)
{
    // BigQuery へのアクセス準備(事前にコンソール側でデータセットやテーブルの作成は済ませておく)
    $bigquery = new BigQueryClient([
        'projectId' => 'test_project', // project名
    ]);
    $dataset = $bigquery->dataset('test_dataset'); //データセット名
    $table = $dataset->table('test_table'); //テーブル名

    // CSVファイル内の(\N = NULL)の設定
    $options = [
        'configuration' => [
            'load' => [
                'nullMarker' => "\N"
            ]
        ]
    ];
    // 読み込むcsvファイルを指定
    $uri = "gs://test_bucket/test.csv";
    // オプション等を設定
    $loadConfig = $table->loadFromStorage($uri, $options)->writeDisposition('WRITE_TRUNCATE');
    // csvデータのBigQueryへの転送処理
    $job = $table->runJob($loadConfig);

    // ExponentialBackoff処理
    $backoff = new ExponentialBackoff(10); //リトライ数を設定
    $backoff->execute(function () use ($job) {
        $job->reload();
        if ($job->isComplete() === false) {
            throw new Exception('Job has not yet completed', 500);
        }
    });

    // 実行結果の検証
    $info = $job->info();
    if (isset($info['status']['errorResult'])) {
        // エラー処理など
    }
}

今回Cloud Functionsの実行は、イベントタイプをCloud Storage(google.storage.object.finalize)にして対象のバケットにファイルが格納されると起動するようにしています。

CSVファイル内のカラムにNULLが存在する場合は「\N」で設定されていることを前提に、BigQueryClientのloadFromStorageにオプションを設定しています。

BigQueryへの転送は、処理に時間が掛かることもあるので、実行が失敗した時のためにExponential Backoff でのリトライ処理を入れています。

実行するCloud Functionsとは別のプロジェクトのBigQueryへ転送したい場合は、Cloud Functionsのサービスアカウント(のメールアドレス)を別プロジェクトのIAMにプリンシパルで追加する必要があります。
権限は下記で動きますが、必要な権限のみに絞る方が良いと思います。
・BigQuery ジョブユーザー
・BigQuery データ編集者

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?