Google cloud platform BigQuery外部表创建失败,返回“0”;“自动检测”;从Google Drive读取文件时的架构

Google cloud platform BigQuery外部表创建失败,返回“0”;“自动检测”;从Google Drive读取文件时的架构,google-cloud-platform,google-bigquery,flysystem-google-drive,Google Cloud Platform,Google Bigquery,Flysystem Google Drive,我正试图通过从Google Drive读取一个文件来创建一个BigQuery外部表-它使用内联模式工作,但使用autodetect标志失败 参考文件: 架构文件: $ bq mkdef --autodetect --source_format=CSV "https://drive.google.com/open?id=<file-id>" > schema.json { "autodetect": true, "cs

我正试图通过从Google Drive读取一个文件来创建一个BigQuery外部表-它使用内联模式工作,但使用
autodetect
标志失败

参考文件:

架构文件:

$ bq mkdef --autodetect --source_format=CSV "https://drive.google.com/open?id=<file-id>" > 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.
$bq mk--external_table_definition=col1:INTEGER,col2:STRING@CSV=https://drive.google.com/open?id= mydataset.mytable
已成功创建表“myproject:mydataset.mytable”。
注意:我已经通过使用
gcloud auth login——启用gdrive访问启用了谷歌硬盘访问


显然,罪魁祸首是
“autodetect”:true
,当从驻留在Google Drive中的源数据创建Bigquery时,在表定义文件
--external_table_definition
中指定

实际上,
bq
命令行工具是一个与之交互的Python脚本,这意味着我们触发
表。插入
API来创建一个永久的外部表,在json请求体中提供适当的接口

您可以在使用
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
现在,您可以提供内联模式(在命令行上),也可以提供一个包含模式定义的JSON文件来完成工作


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

显然,罪魁祸首是
“自动检测”:true
,从Google Drive中的源数据创建Bigquery时,在表定义文件--external_table_definition中指定

实际上,
bq
命令行工具是一个与之交互的Python脚本,这意味着我们触发
表。插入
API来创建一个永久的外部表,在json请求体中提供适当的接口

您可以在使用
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
现在,您可以提供内联模式(在命令行上),也可以提供一个包含模式定义的JSON文件来完成工作


为了让开发者更容易看到这个问题的证据,我鼓励你通过公共问题提交bug报告,这样我们就可以跟踪发生的任何更新或尝试联系谷歌。

这个问题实际上似乎与身份验证有关。值得一提的是,
gcloud
使用了与
bq
不同的OAuth令牌

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

  • 查找
    $HOME/.bigqueryrc
    ,有
    凭证\u文件=
  • 删除上一步中引用的
    credential\u文件
    (在Linux/macOS上可能类似于
    .config/gcloud/…
  • 运行
    gcloud auth--enable gdrive access--force
    ,OAuth窗口也会询问您使用gdrive的权限
  • 请重试创建外部表定义

  • 如果仍然不起作用,您可以通过预览
    credential\u file
    中引用的文件来查找令牌使用的作用域。这是一个简单的JSON文件,作用域只是一个URI列表,应该有一个带有
    drive
    drive.read

    这个问题实际上似乎与身份验证有关。值得一提的是,
    gcloud
    使用了与
    bq
    不同的OAuth令牌

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

  • 查找
    $HOME/.bigqueryrc
    ,有
    凭证\u文件=
  • 删除上一步中引用的
    credential\u文件
    (在Linux/macOS上可能类似于
    .config/gcloud/…
  • 运行
    gcloud auth--enable gdrive access--force
    ,OAuth窗口也会询问您使用gdrive的权限
  • 请重试创建外部表定义
  • 如果仍然不起作用,您可以通过预览
    credential\u file
    中引用的文件来查找令牌使用的作用域。这是一个简单的JSON文件,作用域只是一个URI列表,应该有一个带有
    drive
    drive.read