微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决从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。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?