【问题标题】:Querying tables that consist of google sheets data, google big query查询由谷歌表格数据组成的表,谷歌大查询
【发布时间】:2018-08-18 20:54:06
【问题描述】:

我一直在尝试从包含 google 表格数据的临时表(表定义)中进行查询,但在 code.gs 中不断出现错误。以下是我的代码:

function test(){

var projectId = 'projectId';
var datasetId = 'datasetId';
var tableId = 'tableId';
var sheet_url = 'the_url_of_google_sheet';

var tableName = 'sheet_tab';
var tableProps = {
    externalDataConfiguration:{
    sourceUris: [sheet_url],
    googleSheetOptions:{
      skipLeadingRows: 1
    },
    sourceFormat: 'GOOGLE_SHEETS',
    autoDetect: true 
   }
}
var tableDef = {};
tableDef[tableName] = tableProps;
var sql = 'SELECT * FROM ' +tableName+';';

var jobConfig = BigQuery.newJobConfigurationQuery();
jobConfig.destinationTable = {projectId : projectId, datasetId : datasetId, 
tableId: tableId};
jobConfig.query = sql;
jobConfig.writeDisposition = 'WRITE_APPEND';
jobConfig.tableDefinitions = tableDef;

var queryR = BigQuery.Jobs.query(jobConfig, projectId)
}

错误消息是“表名”无法解析,数据集名称丢失。

【问题讨论】:

  • 一般来说,您需要提供收到的确切错误消息,并指出哪一行导致错误。对于这种情况,我相信您的问题是您试图连接一个 sql 字符串和一个对象 (tabledef),而不仅仅是 BigQuery 表标识符。
  • 实际上我找不到任何示例,我只是根据我从google api的表定义页面获得的理解写的。关于生成的 sql,我如何找出问题所在,因为我无法在大查询中运行它 - 一旦我运行它就会创建一个临时表。
  • 还只是进一步更新了代码 - 这是我在编写其余部分之前首先尝试开始工作的整个功能。 cloud.google.com/bigquery/external-data-drive#temporary-tables - 提及临时表以及如何定义表定义。
  • 编辑您的帖子以包含当前错误的 MCVE。
  • 更新了代码和当前错误。似乎它没有将 tableName 识别为外部数据源(临时表)并要求数据集。我正在进一步检查可能是什么问题。

标签: google-apps-script google-bigquery


【解决方案1】:

调用 BigQuery 时的错误源自您发送的无效 SQL。您的 SQL 无效,因为您将字符串 ("SELECT * FROM") 与 Object 连接。您需要将表标识符而不是表定义附加到 SQL。 (您还缺少“FROM”关键字和添加的内容之间的空格。)

来自page you link,它给出了一个为临时表构建表定义的示例(在 Python 中):

# Configure the external data source and query job
external_config = bigquery.ExternalConfig('GOOGLE_SHEETS')
sheet_url = "some url"
external_config.source_uris = [sheet_url]
external_config.schema = [
    bigquery.SchemaField('name', 'STRING'),
    bigquery.SchemaField('post_abbr', 'STRING')
]
external_config.options.skip_leading_rows = 1  # optionally skip header row
table_id = 'us_states'

job_config = bigquery.QueryJobConfig()
job_config.table_definitions = {table_id: external_config}  # <-- variable assignment in constructor

# Example query to find states starting with 'W'
sql = 'SELECT * FROM {} WHERE name like "W%"'.format(table_id)

query_job = client.query(sql, job_config=job_config)  # API request

要点是,在您的 SQL 中使用的表名是您存储表定义的属性。在您的代码中,这将是 "tab":

var tabledef = {
  tab: { // <--- the name of your temporary table is "tab"
    sourceUris: [sheet_url],
    googleSheetOptions:{
      skipLeadingRows: 1
    },
    sourceFormat: 'GOOGLE_SHEETS',
    autoDetect: true 
  }
}

请注意,Python 代码能够在其dict 的文字对象构造函数中使用变量键赋值,而类似的(“速记”)是not valid in Apps Script(但可以在较新的 JavaScript 版本中完成)。

为您和任何需要了解您的代码的人提供一种更明确的方式来识别给定查询的表:

const tableName = /** .... */;
const tableProps = {
  ...
};
const tableDef = {};
tableDef[tableName] = tableProps;
var query = "SELECT * FROM " + tableName + ";";
...

【讨论】:

  • 我也更新了这个: var jobConfig = BigQuery.newJobConfigurationQuery(); jobConfig.tableDefinitions = tableDef; jobConfig.query = sql; var queryR = BigQuery.Jobs.query(jobConfig, projectId);这给出了一个新错误:无法解析表名“tableName”:缺少数据集名称。
猜你喜欢
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 2016-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多