BigQuery:使用Apps脚本附加到现有表

时间:2016-07-10 13:58:07

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

我有一张桌子,需要根据Google表格中的新数据添加更多记录。

我知道如何使用union来实现它,这意味着运行

Select * from (SELECT * from table),(select * from temp_table_from_sheets)

I.e:查询旧表,新表。删除旧表并将查询结果保存为旧表。

但必须只能附加BigQuery.Jobs.insert而不是{。}}。

你能帮我吗?

编辑 - 解决方案

在得到以下答案后,我搜索了很多内容,最终在Apps Script中提出了以下解决方案

var sql = 'select ...'
var projectId = '...'
var datasetId = '...'
var tableId = '...'

var job = {
    configuration: {
      query: {
        query: sql,
        writeDisposition:'WRITE_APPEND',
        destinationTable: {
          projectId: projectId,
          datasetId: datasetId,
          tableId: tableId
        }       
      }
    }
  };

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

2 个答案:

答案 0 :(得分:0)

来自BigQuery API Basics - Managing Tables

  

追加数据

     

您可以从源文件或表中将其他数据加载到表中   通过附加查询结果。请注意加载数据的架构   必须与现有表的架构匹配,但您可以在追加之前update the schema

     

...

     

要附加查询结果中的数据:

     

运行异步查询,传入现有表的名称,   并设置writeDisposition=WRITE_APPEND

答案 1 :(得分:0)

将Google表格内容推送到BigQuery I found it here

棘手的是将工作表数据转换为CSV。

var file = SpreadsheetApp.openByUrl(url).getSheetByName(sheetName);

  // This represents ALL the data

  var rows = file.getDataRange().getValues();

  var rowsCSV = rows.join("\n");

  var blob = Utilities.newBlob(rowsCSV, "text/csv");

  var data = blob.setContentType('application/octet-stream');


  // Create the data upload job.
  var job = {
    configuration: {
      load: {
        destinationTable: {
          projectId: projectId,
          datasetId: datasetId,
          tableId: tableId
        },
        skipLeadingRows: 1,
        writeDisposition: writeDispositionSetting
      }
    }
  };

  // send the job to BigQuery so it will run your query
  var runJob = BigQuery.Jobs.insert(job, projectId, data);
  Logger.log(runJob.status);
  var jobId = runJob.jobReference.jobId
  Logger.log('jobId: ' + jobId);
  var status = BigQuery.Jobs.get(projectId, jobId);

  // wait for the query to finish running before you move on
  while (status.status.state === 'RUNNING') {
    Utilities.sleep(500);
    status = BigQuery.Jobs.get(projectId, jobId);
    Logger.log('Status: ' + status);
  }
  Logger.log('FINNISHED!');
}