用于自动化 Bigquery 的 Apps 脚本运行但不执行任何操作

Posted

技术标签:

【中文标题】用于自动化 Bigquery 的 Apps 脚本运行但不执行任何操作【英文标题】:Apps Script to automate Bigquery runs but doesn't do anything 【发布时间】: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(错误代码:重复)”如何让代码覆盖表?谢谢 请先用错误更新您的问题。 【参考方案1】:

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

    WRITE_TRUNCATE:如果表已存在,BigQuery 会覆盖表数据。 WRITE_APPEND:如果表已存在,BigQuery 会将数据附加到表中。 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);  

【讨论】:

以上是关于用于自动化 Bigquery 的 Apps 脚本运行但不执行任何操作的主要内容,如果未能解决你的问题,请参考以下文章

有没有办法在仅附加模式下使用 Google Apps 脚本将数据从 BigQuery 加载到 Google 表格?

用于大查询的 Apps 脚本

使用 Apps 脚本定义/创建 BigQuery 保存视图的 SQL 查询

等待在 Apps 脚本中插入 BigQuery?

来自 Apps 脚本的 DELETE 的 BigQuery 错误? [复制]

通常如何从 Google Apps 脚本访问 BigQuery