从Google云端硬盘读取文件时,BigQuery外部表创建失败,并带有“自动检测”架构

问题描述

我正在尝试通过从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.

注意:我已使用gcloud auth login --enable-gdrive-access

启用了Google云端硬盘访问权限

解决方法

显然,罪魁祸首是"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令牌。

我认为目前最佳的做法是:

  1. 查找$HOME/.bigqueryrc,有credential_file = 行,
  2. 删除上一步中引用的credential_file(在Linux / macOS上可能类似于.config/gcloud/...
  3. 运行gcloud auth --enable-gdrive-access --force,OAuth窗口也应该询问您使用GDrive的权限,
  4. 重试创建的外部表定义。

如果仍然无法使用,则可以通过预览credential_file中引用的文件来查找与令牌一起使用的范围。这是一个简单的JSON文件,作用域只是URI的列表,应该有一个带有drivedrive.read的URI。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...