【问题标题】:Apps Script to automate Bigquery runs but doesn't do anything用于自动化 Bigquery 的 Apps 脚本运行但不执行任何操作
【发布时间】:2017-03-29 10:33:11
【问题描述】:

我将此作为一个新问题发布,因为它与我在此问题上的原始问题略有不同。

我有一个应用脚本可以在 BigQuery 中运行查询。该脚本正在运行并与 BigQuery 通信,但该作业未按预期工作。我目前在 BigQuery 中收到以下错误:

已经存在:表 fiery-cabinet-111****:***.Test4(错误代码:重复)

这是脚本:

function saveQueryToTable() {
  var projectId = 'fiery-cabinet-*****';
  var datasetId = '11****101';
  var tableId = 'Test4';
  var job = {
    configuration: {
      query: {
        query: 'SELECT * ' +
               'FROM [fiery-cabinet-****:*****.Test2];',
        destinationTable: {
          projectId: projectId,
          datasetId: datasetId,
          tableId: tableId
        }
      }
    }
  };

var queryResults = BigQuery.Jobs.insert(job, projectId);
  Logger.log(queryResults.status);
}

【问题讨论】:

  • 您也需要发布错误!查看代码我知道它可能是什么,但在看到错误之前我无能为力。
  • 嘿@GrahamPolley 感谢您的评论。我实际上没有得到错误。在启用以下 API 之前,我曾经遇到过错误:“找不到项目 603804914871,不能用于 API 调用。(第 19 行,文件“代码”)”但现在我没有发生这种情况相关 API 已启用
  • 控制台或日志中一定有显示...
  • @GrahamPolley 你是对的,刚刚在 BigQuery 中看到了一个错误。它说:“已经存在:表 fiery-cabinet-160811:112345101.Test4(错误代码:重复)”如何让代码覆盖表?谢谢
  • 请先用错误更新您的问题。

标签: google-apps-script google-bigquery


【解决方案1】:

您正在写入查询结果的表已经存在。您需要将WRITE_DISPOSITION 设置为:

  1. WRITE_TRUNCATE:如果表已存在,BigQuery 会覆盖表数据。
  2. WRITE_APPEND:如果表已存在,BigQuery 会将数据附加到表中。
  3. WRITE_EMPTY:如果表已存在且包含数据,则作业结果中会返回“重复”错误。

默认值为 WRITE_EMPTY。

https://cloud.google.com/bigquery/docs/reference/rest/v2/jobs#configuration.query

configuration.query.writeDisposition

【讨论】:

  • 谢谢,您能在代码本身中显示它的外观吗?
【解决方案2】:

您的选择查询中似乎缺少数据集名称。更改查询以包含数据集名称

query: 'SELECT *' +
       'FROM 11****101.Test2;',

并通过查看执行记录和日志来验证语法

请注意,如果您有访问权限并且语法(即项目、表和数据集名称)正确,您的代码将只使用 BigQuery 记录表插入作业,然后完成。

脚本完成与 BigQuery 作业完成不同,因为您必须轮询作业状态。例如,您可以尝试插入到已经存在的表中,这将成功发布作业,但在执行时失败(取决于设置的参数)。

尝试如下获取查询完成状态

var queryResults = BigQuery.Jobs.insert(job, projectId);

  var jobId = queryResults.jobReference.jobId;
  var response = 'Running'

  var sleepTimeMs = 500;
  while (response != 'DONE') {
    Utilities.sleep(sleepTimeMs);
    response = BigQuery.Jobs.get(projectId, jobId).status.state;
  }

  Logger.log('Job status : ' + queryResults.status);  

【讨论】:

    猜你喜欢
    • 2021-07-01
    • 2012-09-17
    • 2017-08-15
    • 2012-09-20
    • 1970-01-01
    • 2021-06-18
    • 2016-07-31
    • 2013-04-10
    • 2020-07-30
    相关资源
    最近更新 更多