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 表格电子表格,分别称为 Sheet1
和 Sheet2
:
https://docs.google.com/spreadsheets/d/1P1WH7cwVDaG6k-OQxKVXtnjBXI1NGFYvHD6IxCRFsZc/edit?usp=sharing
Sheet1
在第 1 行有列 col1
和 col2
,Sheet2
在第 1 行有列 col3
和 col4
。
我希望能够使用命令行 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"
,
]
鉴于我的电子表格有两张表,Sheet1
和 Sheet2
,我在我的 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 令牌