从 Google 脚本将数据插入 BigQuery:遇到“”

Posted

技术标签:

【中文标题】从 Google 脚本将数据插入 BigQuery:遇到“”【英文标题】:Insert data into BigQuery from a Google Script : Encountered "" 【发布时间】:2019-06-18 15:52:39 【问题描述】:

我正在尝试通过 Google 应用脚本将数据从 Google 电子表格导入 BigQuery。我可以下载数据,但是当我尝试执行 INSERT INTO 时出现错误。错误信息是

在第 1 行第 31 列遇到“”。[尝试使用标准 SQL (https://cloud.google.com/bigquery/docs/reference/standard-sql/enabling-standard-sql)]

这是我的代码:

function insertRowsInBigQuery()
var projectId = 'xxx';
var spreadsheet = SpreadsheetApp.getActive();
var sheet = spreadsheet.getSheetByName("EPC");

var data = sheet.getRange(2, 1, sheet.getLastRow() - 1, 2).getValues();
var sqlData = "INSERT INTO ean.eanToAnalyze (EPC, EAN) VALUES (";

for (i = 0; i < data.length; i++)
  if (i > 0) 
    sqlData += ",(";
  
  for (j = 0; j < data[0].length; j++)
    sqlData += "'" + data[i][j] + "'";
    if (j < data[0].length -1)
      sqlData += ",";
     else 
      sqlData +=")";
    
       


var request = 
  query: sqlData,
  writeDisposition: 'WRITE_TRUNCATE'
;

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

// Check on status of the Query Job.
var sleepTimeMs = 500;
while (!queryResults.jobComplete) 
  Utilities.sleep(sleepTimeMs);
  sleepTimeMs *= 2;
  queryResults = BigQuery.Jobs.getQueryResults(projectId, jobId);


Logger.log(queryResults);


使用几乎相同的功能,只需通过 SELECT 更改 INSERT INTO,即可获取数据。

【问题讨论】:

【参考方案1】:

如错误所示,您需要enable standardSQL 才能使用DML。最简单的方法似乎是为您的查询添加前缀:

var sqlData = "#standardSQL\nINSERT INTO ean.eanToAnalyze (EPC, EAN) VALUES (";

【讨论】:

【参考方案2】:

实现相同目的的另一种方法是将useLegacySql 参数设置为false。 您可以按如下方式更新请求变量:

var request = 
  query: sqlData,
  writeDisposition: 'WRITE_TRUNCATE',
  useLegacySql: false
;

【讨论】:

以上是关于从 Google 脚本将数据插入 BigQuery:遇到“”的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Google Apps 脚本将来自 Google 电子表格和 ScriptDB 的数据插入 BigQuery 表

从 Google Cloud Datalab 向 BigQuery 插入数据时如何调试解析错误?

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

尝试从容器引擎 pod 将数据插入 BigQuery 失败

Google Apps 脚本:从 AuthConfig 到 Bigquery

从其他 Google Cloud 服务流式传输数据时,是不是可以修复失败的 BigQuery 插入?