2

Возможно ли извлечь данные (в облачное хранилище Google) из общего набора данных (где у меня есть разрешения на просмотр) с использованием клиентских API (python)?Извлечение данных BigQuery из общего набора данных

Я могу сделать это вручную с помощью веб-браузера, но не могу заставить его работать с использованием API.

Я создал проект (MyProject) и учетную запись службы MyProject для использования в качестве учетных данных при создании службы с использованием API. У этой учетной записи есть разрешения на доступ к общему набору данных (MySharedDataset) и разрешения на запись в моем хранилище облачных хранилищ Google. Если я пытаюсь запустить работу в своем собственном проекте, чтобы извлечь данные из общего проекта:

job_data = { 
     'jobReference': { 
      'projectId': myProjectId, 
      'jobId': str(uuid.uuid4()) 
     }, 
     'configuration': { 
      'extract': { 
       'sourceTable': { 
        'projectId': sharedProjectId, 
        'datasetId': sharedDatasetId, 
        'tableId': sharedTableId, 
       }, 
       'destinationUris': [cloud_storage_path], 
       'destinationFormat': 'AVRO' 
      } 
     } 
    } 

Я получаю ошибку:

googleapiclient.errors.HttpError: https://www.googleapis.com/bigquery/v2/projects/sharedProjectId/jobs?alt=json returned "Value 'myProjectId' in content does not agree with value sharedProjectId'. This can happen when a value set through a parameter is inconsistent with a value set in the request.">

Использование sharedProjectId в обоих jobReference и SourceTable я получаю:

googleapiclient.errors.HttpError: https://www.googleapis.com/bigquery/v2/projects/sharedProjectId/jobs?alt=json returned "Access Denied: Job myJobId: The user myServiceAccountEmail does not have permission to run a job in project sharedProjectId">

Использование myProjectId как для работы сразу возвращается со статусом «DONE» и без ошибок, но ничего не было экспортировано. Мой ковш GCS пуст.

Если это действительно невозможно с помощью API, существует ли другой метод/инструмент, который можно использовать для автоматизации извлечения данных из общего набора данных?

* UPDATE *

Это прекрасно работает с использованием API-исследователь работает под моим логином GA. В моем коде я использую следующий метод:

service.jobs().insert(projectId=myProjectId, body=job_data).execute() 

и удалить объект jobReference, содержащий ProjectID

job_data = { 
     'configuration': { 
      'extract': { 
       'sourceTable': { 
        'projectId': sharedProjectId, 
        'datasetId': sharedDatasetId, 
        'tableId': sharedTableId, 
       }, 
       'destinationUris': [cloud_storage_path], 
       'destinationFormat': 'AVRO' 
      } 
     } 
    } 

но это возвращает ошибку

Access Denied: Table sharedProjectId:sharedDatasetId.sharedTableId: The user 'serviceAccountEmail' does not have permission to export a table in dataset sharedProjectId:sharedDatasetId

Моя учетная запись службы в настоящее время является владельцем в общем наборе данных и имеет разрешения на редактирование в MyProject, где еще нужно установить разрешения или можно использовать API-интерфейс python, используя мои учетные данные пользователя GA, а не servi счет?

* UPDATE *

Наконец получил его на работу. Как? Убедитесь, что учетная запись службы имеет разрешения на просмотр набора данных (и если у вас нет доступа, чтобы проверить это самостоятельно, и кто-то говорит вам, что это так, попросите их дважды проверить/отправить вам снимок экрана!)

ответ

0

Убедитесь, что учетная запись службы имеет разрешения для просмотра набора данных (и если вы не имеете доступа, чтобы проверить это самостоятельно, и кто-то говорит вам, что это попросит их дважды проверить/отправить вам скриншот!)

3

После попытки чтобы воспроизвести проблему, я столкнулся с ошибками разбора. Я как-то играл с API на консоли разработчика [2], и это сработало. jobs.insert API Я заметил, что код запроса ниже имел формат, отличный от документации на веб-сайте, поскольку он имеет одинарные кавычки вместо двойных кавычек.

Вот код, который я использовал, чтобы заставить его работать.

{ 
'configuration': { 
    'extract': { 
     'sourceTable': { 
      'projectId': "sharedProjectID", 
      'datasetId': "sharedDataSetID", 
      'tableId': "sharedTableID" 
     }, 
     'destinationUri': "gs://myBucket/myFile.csv" 
    } 
} 
} 

HTTP Request

https://www.googleapis.com/bigquery/v2/projects/myProjectId/jobs POST

Если вы все еще сталкиваетесь с проблемами, вы можете попробовать, вы можете попробовать jobs.insert API на сайте [2] или попробовать команду Бк инструмент [3].

Следующая команда может сделать то же самое:

Бк экстракт sharedProjectId: sharedDataSetId.sharedTableId GameSpot: //myBucket/myFile.csv

Надежда это помогает.

[2] https://cloud.google.com/bigquery/docs/reference/v2/jobs/insert

[3] https://cloud.google.com/bigquery/bq-command-line-tool

+0

С помощью bq tool bq running _extract sharedProjectId: sharedDataSetId.sharedTableId gs: //myBucket/myFile.csv_ Я получаю сообщение об ошибке: _Cannot определить таблицу, написанную sharedDatasetId. sharedTableId_ grrr .. –

+0

Cheers Vaqar, он также работает для меня в использовании API исследователь. Используя API-интерфейс python, я устанавливаю projectId (в красном тексте в проводнике API) с помощью объекта jobReference (захват запроса проводника API в скрипаче, я вижу, что он делает то же самое), но я все равно получаю сообщение об ошибке «Значение» myProjectId 'в содержании не согласуется с значением sharedProjectId'. Это может произойти, когда значение, установленное через параметр, не соответствует значению, установленному в запросе. ". Я дам bq tool go go –

+0

Также заметил, что метод python имеет параметры projectid и json как параметры, поэтому я устанавливаю projectId как myProjectId и удаляю объект jobReference из json, но это возвращает ошибку _Access Denied : У пользователя нет разрешения на экспорт таблицы в наборе данных sharedProjectId: sharedDatasetId_ –

Смежные вопросы