2016-10-31 7 views
1

Я пытаюсь запросить анонимную таблицу, созданную в результате запроса набора данных таблицы в BigQuery. Я пытаюсь использовать Jobs.get(), чтобы найти анонимное имя таблицы, используя пример в Google BigQuery Analytics, но я столкнулся с ошибкой.Ошибка: «Требуемый параметр отсутствует» - при получении анонимной таблицы в BigQuery

Google BigQuery аналитик Пример (стр 209):

Reference (Google BigQuery Analytics)

запрос 1:

class QueryHandler(webapp2.RequestHandler): 
credentials = GoogleCredentials.get_application_default() 
service = discovery.build('bigquery', 'v2', credentials=credentials) 
def query1(self): 
    myquery = {'configuration': { 
     'query': { 
      'query': 'SELECT DISTINCT user_id FROM `app.mydataset.mytable`', 
      'destinationTable': { 
      'projectId': projectId, 
      'datasetId': datasetId, 
      'tableId': 'tableId'}, 
      'useLegacySql': False 
       } 
      } 
    } 

    response = service.jobs().query(projectId=projectId, body=myquery).execute() 
    job = service.jobs().get(**response['jobReference']).execute() 
    # both versions of this variable (destination_table) produce the same error message 
    # destination_table = job['configuration']['query']['destinationTable'] 
    destination_table = job['destinationTable'] 

    table = service.jobs().get(projectId=destination_table['projectId'], 
           datasetId=destination_table['datasetId'], 
           tableId=destination_table['tableId']).execute() 
    return table 

Ошибка:

Internal Server Error

The server has either erred or is incapable of performing the requested operation.

....

HttpError: https://www.googleapis.com/bigquery/v2/projects/app_id/queries?alt=json returned "Required parameter is missing">

Мои вопросы:

  1. Почему я получаю эту ошибку? (Я следовал примеру, и я не вижу, что я пропустил)
  2. Как передать анонимное имя таблицы из первого запроса во втором запросе с использованием Python? Например:

запроса 2:

def query2(self): 
.... 
query: SELECT * FROM [anonymous table from query 1] 

ответ

2
  1. Why am I getting this error? (I followed the example and I can't see what I missed)

Ваше тело запроса уродливы для jobs.query API call. Вам не нужен объект «конфигурация» или «запрос», который обертывает то, что у вас есть.

Try:

myquery = { 
    'query': 'SELECT DISTINCT user_id FROM `app.mydataset.mytable`', 
    'useLegacySql': False 
} 

response = service.jobs().query(projectId=projectId, body=myquery).execute() 

В мета-комментарий, мы (команда BigQuery) знает, что «обязательный параметр отсутствует» сообщение об ошибке является слишком расплывчатым для отладки, и приводит к путанице подобных ситуациям , Кроме того, непризнанные параметры (например, объект «конфигурация») просто игнорируются, поэтому, если вы неправильно указали параметр в своем запросе, вы можете легко получить ошибку «Обязательный параметр отсутствует». Мы надеемся решить эту проблему в будущих обновлениях API.


  1. How can I pass an anonymous table name from the first query in the second query using Python?

Вы должны быть в состоянии получить таблицу назначения из jobs.get response, предполагая, что вы пройти в планируемом jobReference.

Однако, обратите внимание, что использование этой анонимную таблицы в другом запросе является unsupported operation on anonymous results tables, без гарантий:

The query results from this method are saved to a temporary table that is deleted approximately 24 hours after the query is run. You can read this results table by calling either bigquery.tabledata.list(table_reference) or bigquery.jobs.getQueryResults(job_reference). The table and dataset name are non-standard, and cannot be used in any other APIs, as the behavior may be unpredictable.

Вместо этого, вы, вероятно, лучше проходит в явной таблице назначения, которая может быть сделана только с jobs.insert, а не с jobs.query. Найдите параметр configuration.query.destinationTable.

Вы можете поместить эти таблицы назначения в набор данных, который sets up an expiration time for contained tables через определенное количество времени (час, день или ...), если вы обеспокоены тем, чтобы держать их на некоторое время.

+0

Спасибо за помощь. Я попытался понять документацию BigQuery API, но, к сожалению, он довольно ограничен. Я редактировал свой код на основе вашего предложения для вопроса 1, и он разрешил ошибку. – fragilewindows

+0

Что касается использования анонимных таблиц, я бы не использовал этот метод, тем не менее, у меня есть 3 запроса, которые происходят в обратном порядке, и они зависят от результатов, сохраненных в каждой таблице. 'jobs.insert' не будет проблемой, если он работает так же, как' jobs.query', но ждет его сохранения в постоянную таблицу, а затем запрос к таблице представляет свои проблемы. Если у меня возникнут проблемы, я переосмыслию использование 'jobs.insert'. Я думаю, что работа cron каждые 24 часа будет работать с анонимными столами. Я скоро увижу. Еще раз спасибо. – fragilewindows

+0

Обратите внимание, что 'jobs.query' выполняет, по существу, ту же операцию, что и' jobs.insert', но сохраняет в таблицу назначения с системным именем. Основное различие между API-интерфейсами заключается в том, что запрос - это зависающий запрос, который возвращается, когда задание завершается, а jobs.insert запускает асинхронное задание. Если вы хотите, чтобы подобное поведение выполнялось с помощью 'jobs.query', вы можете использовать' jobs.insert', за которым следует 'jobs.getQueryResults', поскольку getQueryResults будет ждать завершения аналогично запросу. Подробнее в [нашей документации] (https://cloud.google.com/bigquery/querying-data#running_asynchronous_queries). –

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