0
0

More than 1 year has passed since last update.

BigQueryにデータを格納

Last updated at Posted at 2022-03-02

前提

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

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

スタートガイドでサービスアカウントを作成

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

keyの作成

  1. 上記手順で作成したアカウントがあることを確認
  2. そのアカウントのリンクをクリック
  3. 「キー」を選択
  4. 鍵を追加、「新しい鍵を作成」をクリック
  5. 「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. データセットからテーブルを作成
  2. テーブル名の入力
  3. フィールドを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を実行
  2. 別ターミナルでcurl http://localhost:8080を叩く

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

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

参考文献

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