Ошибка Http: 400 отсутствует обязательный параметр при использовании jobs.query () BQ API - PullRequest
0 голосов
/ 29 мая 2018

Я не смог найти точно такой же вопрос в переполнении стека.Извиняюсь, если это повторный вопрос.Я использую этот фрагмент кода для передачи запроса к таблице.

_body = {'_query':'SELECT * FROM `<projectId>.<datasetId>.<tableId>`',
                   'useLegacySql': False,
                   'maxResults': 100                  
                   }

table = _bq.jobs().query(projectId= <projectId>,alt = "json", body = _body).execute()

Я передаю все необходимые аргументы, поскольку при использовании jobs.query API я получаю код состояния 200,с результатами, но при интеграции фрагмента в программу Python я получаю следующую ошибку:

Файл "D: \ Applications \ Python27 \ lib \ site-packages \ oauth2client \ _helpers.py", строка133, в positional_wrapper \ n вернуть упакованный (* args, ** kwargs) \ n ',' Файл "D: \ Applications \ Python27 \ lib \ site-packages \ googleapiclient \ http.py", строка 842, в выполнить \ nповысить HttpError (соответственно, content, uri = self.uri) \ n ',' HttpError: https://www.googleapis.com/bigquery/v2/projects/projectId/queries?alt=json вернул "Обязательный параметр отсутствует"> \ n ']

Ответы [ 3 ]

0 голосов
/ 29 мая 2018

Я считаю, что проблема не в параметрах bq, а в параметрах execute ().Он должен иметь параметр http, где вы предоставляете http-контекст с учетными данными пользователя

В appengine вы можете сделать что-то вроде этого

SCOPE='https://www.googleapis.com/auth/bigquery https://www.googleapis.com/auth/cloud-patform '
_http = AppAssertionCredentials(scope=SCOPE).authorize(httplib2.Http(timeout=600))
table = _bq.jobs().query(projectId= <projectId>,alt = "json", body = _body).execute(http=_http)
0 голосов
/ 30 мая 2018

Вы действительно не отправляете требуемые параметры.Проверьте этот пример , как правильно сделать это:

def sync_query(service, project_id, query, timeout=10000, num_retries=5):
    query_data = {
                    'query': query,
                    'timeoutMs': timeout,
                 }
    return service.jobs().query(
            projectId=project_id,
            body=query_data).execute(num_retries=num_retries)
0 голосов
/ 29 мая 2018

Я не уверен, какую библиотеку вы используете в своем примере, но я бы посоветовал использовать клиентские библиотеки Python BigQuery .Вы найдете полную ссылку (а также множество примеров) на справочной странице GitHub .

Более конкретно, здесь вы найдете несколько примеров по , как запрашивать данные с помощьюклиентская библиотека Python .

После установки клиентской библиотеки и настройки аутентификации (оба шага описаны в первая ссылка, которой я поделился ), вы сможете выполнить скрипттакой как тот, который я представляю ниже.В нем запрашивается общедоступный набор данных, но вы можете изменить запрос так, как вам нужно.

from google.cloud import bigquery

client = bigquery.Client()

# Define the query
query = "SELECT * FROM `bigquery-public-data.stackoverflow.posts_questions` LIMIT 10"

# Define the query job, by default uses Standard SQL
query_job = client.query(query)

results = query_job.result()  # Waits for job to complete.

for row in results:
    print("{}".format(row.title))

Также обратите внимание, что в этой клиентской библиотеке по умолчанию используется стандартный SQL (предпочитаемый язык).работать с BigQuery), но вы всегда можете изменить настройки задания, настроив QueryJobConfig.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...