如何将数据从 bigquery 导出到应用程序脚本

How to export data from bigquery to apps scripts

如何将大数据从bigquery导出到应用程序脚本? 我已经尝试过 BigQuery.TableData.list() 方法,但是对于大数据它就不起作用了。 我也尝试用简单的查询来做到这一点

SELECT * FROM table

但它returns只有70000个1.2M。 如何使用作业导出 json 文件中的这些数据?或者其他解决方案是什么

您可以使用 BigQuery.Jobs.query() 函数获取数据并将其导出到 JSON.

但是,此函数仅从查询结果的一页中检索所有行。

为了从查询结果的所有页面中检索所有其他数据,您需要使用 pageToken 添加以下 while 循环 for jobs.getQueryResults() 参数循环并连接每页的检索行,如下面的代码所示。 jobs.getQueryResults() 最多只能 return 20MB,这就是我们需要循环和连接页面的原因。您可以参考此Paging Through Tables Documentation了解更多详情。

function myFunction() {
  var projectId = '<project_ID>';

  var request = {
    query: 'SELECT * ' +
      'FROM `publicdata.samples.shakespeare`;',
    useLegacySql: false
  };

  var queryResults = BigQuery.Jobs.query(request, projectId);
  var jobId = queryResults.jobReference.jobId;
  queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId);

  var rows = queryResults.rows;
 
  while (queryResults.pageToken) {
    queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId, {
      pageToken: queryResults.pageToken
    });
    rows = rows.concat(queryResults.rows);
  }
  
  console.log(rows.length);
}

下面是不使用while循环的代码执行结果。在 莎士比亚 table 的 164656 行中,我只能检索到 87500 行。

下面是使用while循环的代码的执行结果。我能够从 shakespeare table 的 164656 行中检索所有 164656 行。

更新: 请参阅下面更新的代码:

 function myFunction() {
      var projectId = '<project_ID>';
    
      var request = {
        query: 'SELECT * ' +
          'FROM `bigquery-public-data.census_bureau_usa.population_by_zip_2010`;',
        useLegacySql: false
      };
    
      var max = 10000;
    
      var queryResults = BigQuery.Jobs.query(request, projectId, {
          maxResults: max
        });
    
      var jobId = queryResults.jobReference.jobId;
      queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId, {
          maxResults: max
        });
    
      var rows = queryResults.rows;
    
     let i = 0;
     while (i < 5) {
        queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId, {
          pageToken: queryResults.pageToken,
          maxResults: max
        });
         i++;
        rows = rows.concat(queryResults.rows); 
      }
      
      console.log(rows.length);
    }
 

我用了bigquery-public-data.census_bureau_usa.population_by_zip_2010因为它有160万条记录来复制类似于你的场景的大数据.我还添加了一个迭代以确认我们能够从大数据集中检索特定数量的行。

下面是成功执行的结果,它能够根据我们的循环条件从 160 万条记录中检索出 60000 行。

但是,当我们删除迭代并像我的第一个答案那样使用 while (queryResults.pageToken) 时,我们将遇到 out of memoryruntime exit(当我们使用 BigQuery.TableData.list() 方法),因为它将从大型数据集中获取所有行,而由于某些限制,App 脚本可能无法处理其中的数据。您可能会看到这个 App Script Quota Documentation 供您参考。

我建议使用虚拟机,您可以在其中托管代码并能够处理大数据检索。