Ошибка создания внешней таблицы BigQuery из-за автоматического определения схемы при чтении файла с Google Диска

Я пытаюсь создать внешнюю таблицу BigQuery, читая файл с Google Диска - он работает со встроенной схемой, но не работает с флагом 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


person Soumendra Mishra    schedule 08.09.2020    source источник


Ответы (2)


На самом деле проблема, похоже, связана с аутентификацией. Как бы то ни было, gcloud использует другой токен OAuth, чем bq.

Я думаю, что лучше всего на данном этапе:

  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, должен быть один с drive или drive.read.

person mhaligowski    schedule 11.11.2020

Видимо, виноват "autodetect": true параметр, указанный в файл определения таблицы --external_table_definition при создании внешней таблицы Bigquery из исходных данных, находящихся в Гугл драйв.

Фактически bq инструмент командной строки - это скрипт Python, который взаимодействует с Biqquery REST API , это означает, что мы запускаем tables.insert метод API для создания постоянную внешнюю таблицу с соответствующей ExternalDataConfiguration в Таблица тело запроса json.

Вы можете проверить это, выполнив соответствующий вызов API Bigquery API через API Explorer. использование параметров определения таблицы из 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 трекер, поэтому мы можем отслеживать любые обновления или пытаться связаться с поддержкой Google .

person Nick_Kh    schedule 08.09.2020