BigQuery에서 원하는 데이터를 캡처하는 Firebase Functions 만들기

개요



데이터 분석의 첫걸음으로 "데이터 캡처의 (부분적) 자동화"를 해 보았습니다!

GCS의 CSV에서 자동으로 BigQuery로 가져 오는 Functions를 만듭니다.
GUI·CLI에서도 같은 조작을 할 수 있습니다만, 「특정의 버킷에 두면 자동으로 캡처」를 실시하는 것으로, 사내나 팀내에서도 부담없이 BigQuery를 이용할 수 있게 됩니다.

실제로 움직여보세요



1. Google Cloud Storage에 버킷 만들기



이쪽을 참고로 바삭하게 작성
htps : // c ぉ d. 오, ぇ. 이 m / s 토라게 / 드 cs / c 레아 친 g 부 c ts? hl = 그럼

2. BigQuery에 데이터 세트 만들기



공식 문서가 보기 쉽네요. "gcs_temporary_dataset"이라고 했습니다.
htps : // c ぉ d. 오, ぇ. 이 m/비g 쿠에 ry/어느 cs/대충 ts? hl = 그럼

3. Firebase Functions(Cloud Functions)를 이용하여 배포



캡처하는 CSV는 "{filename}_YYYYMMDD.csv"이며 첫 번째 줄은 필드 이름이라는 규칙입니다.
코드를 사용하여 "버킷에 객체가 만들어졌습니다"를 트리거로 지정할 수 있습니다. 최고! ! !

4. 스토리지에 CSV를 배치하고 BigQuery로 가져오기



도쿄도 오픈 데이터 카탈로그 사이트에서 CSV를 다운로드 해 보았습니다.
파일 이름 끝에 "_20200425"를 붙이는 것을 잊지 마십시오.
h tps : // / ぉg. 했다. 메 t로. 가끔. lg. jp / 두드려 t / t000010d0000000068 / 어서

실제로 캡처된 데이터



헤더가 일본어이므로 필드명이 망가져 버리고 있습니다만 일단 성공.


실제 코드



firebase functions와 typescript를 이용하여 만들었습니다.
'use strict';
import {BigQuery} from '@google-cloud/bigquery';
import {bigquery_v2} from 'googleapis';
import Schema$JobConfigurationLoad = bigquery_v2.Schema$JobConfigurationLoad;
import * as functions from 'firebase-functions';

const projectId = // GCPのプロジェクトID
const backetName = // GCSのバケット名
const datasetId = // BQのデータセットID

export const importBigqueryTemporaryTable = functions
  .runWith({timeoutSeconds: 300, memory: '1GB'})
  .storage.bucket(`${backetName}`)
  .object()
  .onFinalize(async (object) => {
    try {
      const name = object.name!;

      // ファイル名がテーブル名のイメージ
      // hoge_YYYYMMDD以外の名前は許さない
      const matched = name.match(/(.*)_\d{8}/);
      if (!matched) {
        console.log('filename not match.');
        return false;
      }

      const tableId = matched[0];

      const bigquery = new BigQuery();
      const configuration: Schema$JobConfigurationLoad = {
        destinationTable: {
          datasetId: datasetId,
          projectId: `${projectId}`,
          tableId: `${tableId}`,
        },
        sourceFormat: 'CSV',
        sourceUris: [`gs://${object.bucket}/${name}`],
        writeDisposition: 'WRITE_TRUNCATE',
        autodetect: true,
        encoding: 'UTF-8',
        skipLeadingRows: 1, // ヘッダーはカラム定義のイメージ
      };

      await bigquery.createJob({
        configuration: {load: configuration},
      });

      console.log('success to import bigquery temporary table.', tableId);
      return Promise.resolve('success');
    } catch (e) {
      console.log('Failed to import temporary table.', e);
      return Promise.reject(e);
    }
  });

요약



이 코드만으로 "특정 버킷에 넣으면 BigQuery로 가져오기"를 자동화할 수 있었습니다. CSV의 포맷이 올바르지 않을 때는 동작하지 않는 등의 문제는 있습니다만, 최소한의 동작은 실시할 수 있다고 생각합니다.
BigQuery 데이터 세트 설정에서 기본 보존 기한을 설정하면 데이터를 지우는 것을 잊지 않습니다.

질문・지적 기다리고 있습니다!

좋은 웹페이지 즐겨찾기