bigQuery Google Drive 使用 googleSheetsOptions 范围查询多张工作表

Posted

技术标签:

【中文标题】bigQuery Google Drive 使用 googleSheetsOptions 范围查询多张工作表【英文标题】:bigQuery Google Drive query multiple sheets with googleSheetsOptions range 【发布时间】:2018-05-31 15:09:23 【问题描述】:

我创建了一个包含两个工作表的 Google 表格电子表格,分别称为 Sheet1Sheet2

https://docs.google.com/spreadsheets/d/1P1WH7cwVDaG6k-OQxKVXtnjBXI1NGFYvHD6IxCRFsZc/edit?usp=sharing

Sheet1 在第 1 行有列 col1col2Sheet2 在第 1 行有列 col3col4

我希望能够使用命令行 bigQuery 界面查询这两个工作表。 直到 2018 年 5 月添加了一个最近的功能,这似乎是不可能的:

https://issuetracker.google.com/issues/35905674#comment12

我试图复制此评论所描述的内容,但我无法让它发挥作用。这是我到目前为止所做的:

新功能的描述显示了一个示例google_sheets_tabeledef.json,如下所示:


  "autodetect": false,
  "sourceFormat": "GOOGLE_SHEETS", 
  "sourceUris": [
    "https://docs.google.com/spreadsheets/d/xxxxxxxxxxxxxx"
  ],
  "maxBadRecords": 1,
  "googleSheetsOptions":
  
    "range": "test_sheet!A1:B20",
    "skipLeadingRows": 0
  ,
  "schema" : 
    "fields": [
      
        "name": "col1",
        "type": "string"
      ,
      
        "name": "col2",
        "type": "int64"
      ,
    ]
  

鉴于我的电子表格有两张表,Sheet1Sheet2,我在我的 bigQuery 帐户中创建了它们各自的表, 然后我尝试通过命令行bq query 查询它们中的每一个。如Sheet1 所示:

bq query --format=csv --use_legacy_sql=false 'SELECT * FROM `cegx-test-project1.multi_sheet_test.Sheet1`' 2>/dev/null

col1,col2
col1,col2
foo,bar
abc,def

如果我对Sheet2 尝试相同的操作,在没有 external_table_definition 的情况下,它会显示:

bq query --format=csv --use_legacy_sql=false 'SELECT * FROM `cegx-test-project1.multi_sheet_test.Sheet2`' 2>/dev/null

col3,col4
col1,col2
foo,bar
abc,def

所以它基本上恢复到第一个工作表而不是查询Sheet2。到目前为止,正如预期的那样。

然后我创建了一个等效的 google_sheets_sheet2_tabledef.json 文件,如下所示:


  "autodetect": true, 
  "sourceFormat": "GOOGLE_SHEETS", 
  "sourceUris": [
    "https://docs.google.com/spreadsheets/d/1P1WH7cwVDaG6k-OQxKVXtnjBXI1NGFYvHD6IxCRFsZc"
  ],
  "maxBadRecords": 1,
  "googleSheetsOptions":
  
    "range": "Sheet2!A1:B10",
    "skipLeadingRows": 0
  ,
  "schema" : 
    "fields": [
"name":"col3","type":"string",
"name":"col4","type":"string"
    ]
  

注意range 参数中我指向的是Sheet2!A1:B10

如果我尝试再次查询表,现在使用 external_table_definition 标志,我得到:

bq query --external_table_definition="Sheet2::/tmp/google_sheets_sheet2_tabledef.json" --format=csv --use_legacy_sql=false 'SELECT * FROM `cegx-test-project1.multi_sheet_test.Sheet2`' 2>/dev/null                                             

col3,col4
col1,col2
foo,bar
abc,def

所以即使外部定义文件指向Sheet2 中的范围,我仍然可以从Sheet1 获得结果。

问题出在哪里?

【问题讨论】:

@hua-zhang 我无法让issuetracker.google.com/issues/35905674#comment12 上的说明工作,所以我在这里创建了一个新问题。 感谢您报告此事。李正在调查。 【参考方案1】:

看起来您用于从临时外部表定义中查询的命令并未引用外部表。

如果您将命令更改为以下内容,它应该可以按预期工作:

bq 查询 --external_table_definition="Sheet2::/tmp/google_sheets_sheet2_tabledef.json" --format=csv --use_legacy_sql=false 'SELECT * FROM Sheet2' 2>/dev/null

【讨论】:

啊,是的,明白了,我仍然指的是 bigQuery 中定义的表,而不是 external_table_definition 中的表。现在可以了。谢谢。 嗨@li-tan 我昨天让它工作了,现在我写了一个脚本来在 json 文件中自动创建表和 tabledef 创建,我收到一个错误:***.com/questions/50643699/… 可以在谷歌应用脚​​本中完成与上面命令行等效的操作吗? developers.google.com/apps-script/advanced/bigquery

以上是关于bigQuery Google Drive 使用 googleSheetsOptions 范围查询多张工作表的主要内容,如果未能解决你的问题,请参考以下文章

将 CSV 文件从 Google Drive 加载到 BigQuery

BigQuery AppsScript 客户端的默认范围不包括 Google Drive

将 CSV 文件从 Google Drive 加载到 BigQuery 会产生零行且没有错误

将文件从 Google Drive 加载到 Bigquery

尝试从 golang 广告读取/运行对 bigquery 的查询被拒绝访问:BigQuery BigQuery:未找到具有 Google Drive 范围的 OAuth 令牌

bigQuery Google Drive Sheets 一张表中的多个工作表