【问题标题】:Google BigQuery: Error 413 Response is too largeGoogle BigQuery:错误 413 响应太大
【发布时间】:2017-01-16 23:07:23
【问题描述】:

这是一个有时似乎难以重现的问题,但随后反复出现,导致我认为这可能与配额有关,但我看不到我们帐户中设置的任何配额。

var myQuery = 'SELECT * FROM [' + myProjectId + ':' + myDatasetId + '.' + historyTable + '] WHERE ID NOT IN (SELECT ID FROM [' + myProjectId + ':'  + myDatasetId + '.' + federatedTable + '])'

  // Overwrite the history table with a version with only the records that are NOT in federated
   var job = {
    configuration: {
      query: {
        query: myQuery,
        maximumBillingTier: "2",
        writeDisposition:'WRITE_TRUNCATE',
        useQueryCache: true,
        allowLargeResults: true,
        destinationTable: {
          projectId: myProjectId,
          datasetId: myDatasetId,
          tableId: historyTable
        }}
    }};

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



var jobId = queryResults.jobReference.jobId;



// Wait until that job completes


// Check on status of the Query Job.
  var sleepTimeMs = 500;
  while (!queryResults.jobComplete) {
    Utilities.sleep(sleepTimeMs);
    queryResults = BigQuery.Jobs.getQueryResults(myProjectId, jobId);
    Logger.log("Not Done");
  }

错误发生就行了

queryResults = BigQuery.Jobs.getQueryResults(myProjectId, jobId);

该表有 91 列和大约 25,000 行,因此应该远不接近响应的 128mb 限制。

已阅读所有类似的 Stackoverflow 问题并尝试了所有方法!

【问题讨论】:

    标签: sql google-apps-script google-bigquery


    【解决方案1】:

    您似乎想运行一个查询作业,将结果写入指定的目标表。但是,在您的循环中,您每次调用查询本身时都调用getQueryResults 哪个will request all the results。这就是导致 413 的原因。

    我不认为这是你真正想要做的。

    相反,只需轮询job.status.state 以获取job resource 以确定何时完成。这不会将所有结果都拉到线上。例如:

    function runQuery() {
      var projectId = 'XXXXXX';
      var myQuery = 'SELECT TOP(word, 300) AS word, COUNT(*) AS word_count ' +
          'FROM publicdata:samples.shakespeare WHERE LENGTH(word) > 10;'
    
      var job = {
        configuration: {
          query: {
            query: myQuery,
            writeDisposition:'WRITE_TRUNCATE',
            useQueryCache: true,
            allowLargeResults: true,
            destinationTable: {
              projectId: 'XXXXXX',
              datasetId: 'test',
              tableId: 'test_table'
            }}
      }};
    
      var job = BigQuery.Jobs.insert(job, projectId);
      Logger.log(job.status.state);
      var jobId = job.jobReference.jobId;
    
      // Check on status of the Query Job.
      var sleepTimeMs = 500;
      while (job.status.state !== 'DONE') {
        Utilities.sleep(sleepTimeMs);
        job = BigQuery.Jobs.get(projectId, jobId);
        Logger.log(job.status.state);
      }
    }
    

    【讨论】:

    • 谢谢格雷厄姆,但我已经尝试过了,没有任何区别,我将更新上面的代码以显示它已包含在内,还是这种形式不好?如果是这样,请告诉我,我会撤消。此外,该配置更改仅在返回 > 128mb 压缩时才有意义。这离哪个不远了。
    • 等一下。 BigQuery.Jobs.getQueryResults(myProjectId, jobId); 是否尝试通过网络获取查询的实际结果?这真的是你想做的吗?
    • 太棒了!谢谢!
    猜你喜欢
    • 1970-01-01
    • 2019-04-24
    • 2019-08-08
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 2016-02-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多