Ошибка неверного запроса при запросе данных из большого запроса в цикле - PullRequest
0 голосов
/ 13 июня 2018

Я запрашиваю данные из bigquery, используя метод get_data_from_bq, упомянутый ниже в цикле:

def get_data_from_bq(product_ids):
    format_strings = ','.join([("\"" + str(_id) + "\"") for _id in product_ids])
    query = "select productId, eventType, count(*) as count from [xyz:xyz.abc] where productId in (" + format_strings + ") and eventTime > CAST(\"" + time_thresh +"\" as DATETIME) group by eventType, productId order by productId;"
    query_job = bigquery_client.query(query, job_config=job_config)
    return query_job.result()

В то время как для первого запроса (итерации) возвращенные данные верны, все последующие запросы выбрасывают нижеуказанныеисключение

    results = query_job.result()
  File "/home/ishank/.local/lib/python2.7/site-packages/google/cloud/bigquery/job.py", line 2415, in result
    super(QueryJob, self).result(timeout=timeout)
  File "/home/ishank/.local/lib/python2.7/site-packages/google/cloud/bigquery/job.py", line 660, in result
    return super(_AsyncJob, self).result(timeout=timeout)
  File "/home/ishank/.local/lib/python2.7/site-packages/google/api_core/future/polling.py", line 120, in result
    raise self._exception
google.api_core.exceptions.BadRequest: 400 Cannot explicitly modify anonymous table xyz:_bf4dfedaed165b3ee62d8a9efa.anon1db6c519_b4ff_dbc67c17659f

Редактировать 1: Ниже приведен пример запроса, который вызывает указанное выше исключение.Кроме того, это работает гладко в консоли BigQuery.

select productId, eventType, count(*) as count from [xyz:xyz.abc] where productId in ("168561","175936","161684","161681","161686") and eventTime > CAST("2018-05-30 11:21:19" as DATETIME) group by eventType, productId order by productId;

Ответы [ 2 ]

0 голосов
/ 18 июня 2018

У меня была точно такая же проблема.Проблема не в самом запросе, а в том, что вы, скорее всего, используете один и тот же QueryJobConfig.Когда вы выполняете запрос, если вы не установите destination, BigQuery сохраняет результат в анонимной таблице, которая указана в объекте QueryJobConfig.Если вы повторно используете эту конфигурацию, BigQuery пытается сохранить новый результат в той же анонимной таблице, что приводит к ошибке.Честно говоря, мне не особенно нравится такое поведение.

Вы должны переписать свой код так:

def get_data_from_bq(product_ids):
    format_strings = ','.join([("\"" + str(_id) + "\"") for _id in product_ids])
    query = "select productId, eventType, count(*) as count from [xyz:xyz.abc] where productId in (" + format_strings + ") and eventTime > CAST(\"" + time_thresh +"\" as DATETIME) group by eventType, productId order by productId;"
    query_job = bigquery_client.query(query, job_config=QueryJobConfig())
    return query_job.result()

Надеюсь, это поможет!

0 голосов
/ 13 июня 2018

Отредактировано:

Федерико Бертола является правильным в решении и временной таблице, в которую записывает BigQuery , см. Эту ссылку .

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


Вы можете получить ошибку «super (QueryJob, self) .result (timeout = timeout)», когда в строке запроса отсутствуют кавычки вокруг параметров взапрос.Кажется, вы допустили аналогичную ошибку с параметром format_strings в вашем запросе.Вы можете решить эту проблему, убедившись, что вокруг параметра экранированы кавычки:

(" + myparam + ")

, должен быть записан как

(\"" + myparam + "\")

. Вы должны проверить строку запроса, где вы используете параметры, иначните с более простого запроса, такого как

select productId, eventType, count(*) as count from `xyz:xyz.abc`

, и увеличивайте свой запрос по мере продвижения.

Для справки, вот что сработало для меня:

from google.cloud import bigquery
client = bigquery.Client()
job_config = bigquery.QueryJobConfig()

def get_data_from_bq(myparam):  
    query = "SELECT word, SUM(word_count) as count FROM `publicdata.samples.shakespeare` WHERE word IN (\""+myparam+"\") GROUP BY word;"
    query_job = client.query(query, job_config=job_config) 
    return query_job.result()

mypar = "raisin"
x = 1
while (x<9):
    iterator = get_data_from_bq(mypar)
    print "==%d iteration==" % x
    x += 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...