0

我正在尝试通过从 Google Drive 读取文件来创建 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

模式.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 Drive 访问gcloud auth login --enable-gdrive-access

4

2 回答 2

1

显然,这里的罪魁祸首是"autodetect": true parameter ,在从 Google Drive 中的源数据--external_table_definition创建 Bigquery外部表时在表定义文件中指定。

实际上bq命令行工具是一个与Biqquery REST API交互的 Python 脚本,这意味着我们触发tables.insertAPI方法来创建一个永久的外部表,在Table json 请求正文中提供适当的ExternalDataConfiguration 。

您可以检查它在整个API Explorer中使用表定义参数对 Bigquery API 执行相关 API 调用ExternalDataConfiguration

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 文件来完成工作。

为了让开发人员更容易看到这个问题证据,我鼓励您通过Public Issue tracker提交错误报告,这样我们就可以跟踪发生的任何更新或尝试联系 Google支持

于 2020-09-08T12:45:48.600 回答
1

该问题实际上似乎与身份验证有关。对于它的价值,gcloud使用不同的 OAuth 令牌而不是bq.

我认为此时最好的做法是:

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

如果它仍然不起作用,您可以通过预览credential_file. 这是一个简单的 JSON 文件,作用域只是一个 URI 列表,应该有一个带有driveor的 URI drive.read

于 2020-11-11T20:01:10.083 回答