1

在此参考https://developers.google.com/apps-script/advanced/bigquery中,

为了将 CSV 数据加载到 BigQuery,他们使用:

var file = DriveApp.getFileById(csvFileId);
  var data = file.getBlob().setContentType('application/octet-stream');

  // Create the data upload job.
  var job = {
    configuration: {
      load: {
        destinationTable: {
          projectId: projectId,
          datasetId: datasetId,
          tableId: tableId
        },
        skipLeadingRows: 1
      }
    }
  };
  job = BigQuery.Jobs.insert(job, projectId, data);

据我了解,他们向 BigQuery 发送了一个file.getBlob().setContentType('application/octet-stream');不友好的 blob

如何在 Apps 脚本中将 JSON 发送到 BigQuery?

使用库@google-cloud/bigquery(在 Apps 脚本之外的项目中使用),我可以执行以下操作:

https://cloud.google.com/bigquery/streaming-data-into-bigquery#streaminginsertexamples

// Import the Google Cloud client library
const { BigQuery } = require('@google-cloud/bigquery')
const moment = require('moment')

exports.insertUsageLog = async (userId) => {
  const datasetId = 'usage'
  const tableId = 'logs'
  const rows = [
    // The JSON data is collected here
    {
      timestamp: moment.utc().toISOString(),
      userId,
      // Something else ...
    },
  ]

  // Create a client
  const bigqueryClient = new BigQuery()

  // Insert data into a table
  await bigqueryClient
    .dataset(datasetId)
    .table(tableId)
    .insert(rows)
  console.log(`Inserted ${rows.length} rows`)
}
4

1 回答 1

3

数据负载BigQuery.Jobs.insert()必须是一个 blob。

您可以从 CSV 内容或换行符分隔的 JSON创建该 blob 。换行符分隔的 JSON 是BigQuery 所需的一种不同形式的 JSON 。Apps 脚本本身不支持它。但是,您应该能够通过创建自定义replacer函数并将其作为参数传递给JSON.stringify(). 或者,您可能能够利用现有的 Javascript 库(您可能能够通过 NPM 找到一些东西,或者只是在 Github 上进行搜索)。

生成换行符分隔的 JSON(作为字符串或字节数组)后,您需要使用将其转换为 blobUtilities.newBlob()并将其传递给BigQuery.Jobs.insert()方法。

于 2019-09-20T12:00:32.957 回答