问题描述
我正在尝试通过从Google云端硬盘中读取文件来创建BigQuery外部表-它可以使用内联方案,但会失败,并带有autodetect
标志。
引用的文档:
https://cloud.google.com/bigquery/external-data-drive
架构文件:
$ bq mkdef --autodetect --source_format=CSV "https://drive.google.com/open?id=<file-id>" > schema.json
schema.json:
{
"autodetect": true,"csvOptions": {
"encoding": "UTF-8","quote": "\""
},"sourceFormat": "CSV","sourceUris": [
"https://drive.google.com/open?id=<file-id>"
]
}
外部表格:
$ bq mk --external_table_deFinition=schema.json mydataset.mytable
BigQuery error in mk operation: Access Denied: BigQuery BigQuery: No OAuth token with Google Drive scope was found.
它适用于内联模式:
$ bq mk --external_table_deFinition=col1:INTEGER,col2:STRING@CSV=https://drive.google.com/open?id=<file-id> mydataset.mytable
Table 'myproject:mydataset.mytable' successfully created.
注意:我已使用
启用了Google云端硬盘访问权限gcloud auth login --enable-gdrive-access
解决方法
显然,罪魁祸首是"autodetect": true
parameter,是根据驻留在Google云端硬盘中的源数据创建Bigquery external table时在表定义文件--external_table_definition
中指定的。
实际上bq
命令行工具是一个与Biqquery REST API交互的Python脚本,这意味着我们触发tables.insert
API method创建永久的外部表,并提供适当的ExternalDataConfiguration json请求正文中的Table。
您可以在API Explorer期间使用ExternalDataConfiguration
中的表定义参数来执行对Bigquery API的相关API调用:
curl --request POST \
'https://bigquery.googleapis.com/bigquery/v2/projects/<projectid>/datasets/<datasetid>/tables?key=[YOUR_API_KEY]' \
--header 'Authorization: Bearer [YOUR_ACCESS_TOKEN]' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{"tableReference":{"datasetId":"datasetId","projectId":"projectId","tableId":"tableId"},"externalDataConfiguration":{"autodetect":true,"csvOptions":{"encoding":"UTF-8","quote":"\""},"sourceFormat":"CSV","sourceUris":["https://drive.google.com/open?id=<file-id>"]}}' \
--compressed
我在响应消息中收到了相同的错误:
"error": {
"code": 403,"message": "Access Denied: BigQuery BigQuery: No OAuth token with Google Drive scope was found.","errors": [
{
"message": "Access Denied: BigQuery BigQuery: No OAuth token with Google Drive scope was found.","domain": "global","reason": "accessDenied"
}
],"status": "PERMISSION_DENIED"
}
目前,您可以内联提供模式(在命令行上),或者可以提供包含模式定义的JSON文件以使工作正常。
为了使开发人员更容易看到此问题的证据,我建议您通过公共问题 tracker提交错误报告,这样我们就可以跟踪发生的任何更新或尝试联系Google support。
,问题实际上似乎与身份验证有关。就其价值而言,gcloud
使用与bq
不同的OAuth令牌。
我认为目前最佳的做法是:
- 查找
$HOME/.bigqueryrc
,有credential_file =
行, - 删除上一步中引用的
credential_file
(在Linux / macOS上可能类似于.config/gcloud/...
) - 运行
gcloud auth --enable-gdrive-access --force
,OAuth窗口也应该询问您使用GDrive的权限, - 重试创建的外部表定义。
如果仍然无法使用,则可以通过预览credential_file
中引用的文件来查找与令牌一起使用的范围。这是一个简单的JSON文件,作用域只是URI的列表,应该有一个带有drive
或drive.read
的URI。