【问题标题】:Linking mysql with google's bigquery将 mysql 与 google 的 bigquery 链接
【发布时间】:2018-09-04 13:33:28
【问题描述】:

我有一个带有nodejsmysql 的旧版电子商务应用程序。现在我想将这个 mysql 数据添加到 bigquery 数据集。

我应该如何将它们链接/连接在一起?

可行的方法

  • 将数据导出到 csv 并导入到 bigquery。
  • 将数据添加到 Bigquery
  • 同时将其添加到mysql
  • 流插入
  • 创建一个将获取并插入到 bigquery 中的作业。

要实现的目标

  • mysqlbigquery 应该是同步的,(15-30 分钟的延迟无关紧要),

  • 应该有旧数据和新数据,不想一遍又一遍地重新上传,应用程序/工具应该将它们链接在一起

  • 应该也可以从 nodejs 'console.log' 中添加日志数据

我想知道, 有什么更好的方法可以完美地集成它们? 我该怎么做?

【问题讨论】:

  • 如果您愿意接受不干涉但很可能是付费的解决方案,那么有专门从事数据复制的 BigQuery partners
  • 没有第三方(付费服务)就没有办法。我想自己尝试一下。

标签: mysql node.js google-cloud-platform google-bigquery


【解决方案1】:

有几种方法可以做到这一点。也许其中最简单的方法是导出 CSV 并将其上传到 Google Cloud Storage 存储桶。制作一个 Cloud Function,当文件上传到存储桶时会触发它,它会为我们将数据上传到 BigQuery。以下是应采取的步骤:

  1. 在 BigQuery 中创建 new datasettable
  2. 在您的网站上编写脚本以将新数据导出到 CSV 文件并将其上传到存储桶:

    上传到bucket:

    // Imports the Google Cloud client library
    const Storage = require('@google-cloud/storage'); 
    // Creates a client
    const storage = new Storage();
    storage
      .bucket(bucketName)
      .upload(filename)
      .then(() => {
        console.log(`${filename} uploaded to ${bucketName}.`);
      })
      .catch(err => {
        console.error('ERROR:', err);
      });
    
  3. Create a Cloud Function 由每次上传 CSV 文件时触发的存储桶触发,连接到 BigQuery 并将load data 放入表中。

    实例化客户端:

    const BigQuery = require('@google-cloud/bigquery');
    const Storage = require('@google-cloud/storage');
    
    const bigquery = new BigQuery({
      projectId: projectId,
    });
    
    const storage = new Storage({
      projectId: projectId,
    });
    

    根据您的架构配置加载作业:

    const metadata = {
      sourceFormat: 'CSV',
      skipLeadingRows: 1,
      schema: {
        fields: [
          {name: 'column1', type: 'STRING'},
          {name: 'column2', type: 'STRING'},
        ],
      },
    };
    

    将数据从 Google Cloud Storage 文件加载到表中:

    bigquery
      .dataset(datasetId)
      .table(tableId)
      .load(storage.bucket(bucketName).file(filename), metadata)
      .then(results => {
        const job = results[0];
    
        // load() waits for the job to finish
        assert.equal(job.status.state, 'DONE');
        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;
        }
      })
      .catch(err => {
        console.error('ERROR:', err);
      });
    

【讨论】:

  • 这是更多的工作,导出数据,上传到云端。无需上传到 csv 到 cloude 存储,而是可以直接上传到 bigquery。
  • 但同样是这个手动过程,如果以前的数据在 mysql 中得到更新怎么办。或者就像一次又一次地将整个数据库更新为 bigquery。
  • @AnkitBalyan 如果您在您的网站上执行例如 cron 任务,给定的解决方案会自动上传。 BigQuery 并非旨在用作数据库。它的目的是用作数据仓库,可以通过查询对其进行分析。
猜你喜欢
  • 1970-01-01
  • 2019-08-06
  • 2011-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
  • 1970-01-01
相关资源
最近更新 更多