BigQueryにデータを格納

## 前提

以前作成した下記記事の環境からスタートします。

https://qiita.com/sh19982580/items/d0e4fde11e734bee8c76

## サービスアカウントを作成

[スタートガイド](https://cloud.google.com/docs/authentication/getting-started
)でサービスアカウントを作成

1. サービスアカウント名を入力
1. 作成して続行をクリック
1. ロールを選択(今回は編集者にしました)
1. 続行をクリック
1. 完了

#### keyの作成

1. 上記手順で作成したアカウントがあることを確認
1. そのアカウントのリンクをクリック
1. 「キー」を選択
1. 鍵を追加、「新しい鍵を作成」をクリック
1. 「JSON」 で作成

#### JSON

- 上記でダウンロードした「JSON」を`package.json`と同じ階層で`credentials.json`として保存
- envファイルでは、`GOOGLE_APPLICATION_CREDENTIALS="./credentials.json"`のように保管

## BigQuery

`GCP > BigQuery > SQLワークスペース`で予め作成しておくもの
- プロジェクト
- データセット

今回BQに入れたいデータ

    const costGraphData = [
      { date: "01-01", cost: 1100 },
      { date: "01-02", cost: 1200 },
      { date: "01-03", cost: 1000 },
      { date: "01-04", cost: 800 },
      { date: "01-05", cost: 1700 },
      { date: "01-06", cost: 1000 },
      { date: "01-07", cost: 1000 },
      { date: "01-08", cost: 600 },
      { date: "01-09", cost: 800 },
      { date: "01-10", cost: 400 },
      { date: "01-11", cost: 1600 },
      { date: "01-12", cost: 1400 },
      { date: "01-13", cost: 1100 },
      { date: "01-14", cost: 1200 },
      { date: "01-15", cost: 900 },
    ]

1. データセットからテーブルを作成
1. テーブル名の入力
1. フィールドを2つ追加する

`フィールド名：date タイプ：STRING`
`フィールド名：cost タイプ：INTEGER`
※DATE型もありますが、今回はSTRING型で入れます

上記の手順を行い、テーブルを作成

## src > bq.ts

ターミナルで`yarn add @google-cloud/bigquery`を実行

    import { BigQuery } from "@google-cloud/bigquery"

    import { initLogger } from "../logger/index"

    const { infoLogger, errorLogger } = initLogger("logger/index.ts")

    export const insertRowsAsStream = async () => {
      const bigQuery = new BigQuery()
      const costGraphData = [
        { date: "01-01", cost: 1100 },
        { date: "01-02", cost: 1200 },
        { date: "01-03", cost: 1000 },
        { date: "01-04", cost: 800 },
        { date: "01-05", cost: 1700 },
        { date: "01-06", cost: 1000 },
        { date: "01-07", cost: 1000 },
        { date: "01-08", cost: 600 },
        { date: "01-09", cost: 800 },
        { date: "01-10", cost: 400 },
        { date: "01-11", cost: 1600 },
        { date: "01-12", cost: 1400 },
        { date: "01-13", cost: 1100 },
        { date: "01-14", cost: 1200 },
        { date: "01-15", cost: 900 },
      ]

      try {
        infoLogger("Big Query にレコードのインサート開始")
        await bigQuery.dataset(データセット名).table(テーブル名).insert(costGraphData)
        infoLogger("Big Query にレコードのインサート完了")
        return Promise.resolve()
      } catch (error) {
        errorLogger("インサート失敗", { error })
        return Promise.reject(error)
      }
    }

※もしデータを何かで取得した場合、`costGraphData`の形に直してあげればBQにインサートができます。

app.ts

    import express from "express"
    import { insertRowsAsStream } from "./bq"

    const app = express()

    app.use(express.json())

    app.get("/", insertRowsAsStream)

    const port = 8080
    app.listen(port, () => {
      // eslint-disable-next-line no-console
      console.log(`Listening on port ${port}`)
    })

app.tsで`bq.ts`の関数を実行

## 最後に

1. ターミナルで`yarn dev`を実行
1. 別ターミナルで`curl http://localhost:8080`を叩く

1のターミナルでインサートが完了、GCPのBQテーブル(プレビュー)でデータが反映されていればOK！

コードよりも権限やBQを設定する準備の方が難しく、時間がかかりました。
特に「サービスアカウントを作成」手順3番の権限周りが一番苦戦しました...



## 参考文献

https://cloud.google.com/nodejs/docs/reference/bigquery/latest


https://github.com/googleapis/nodejs-bigquery/blob/main/samples/insertRowsAsStream.js