Сбой обновлений BigQuery, но только при пакетной обработке с использованием Python API - PullRequest
0 голосов
/ 14 марта 2019

Я пытаюсь обновить таблицу с помощью операторов пакетного обновления. DML-запросы успешно выполняются в веб-интерфейсе BigQuery, но при пакетировании первый выполняется успешно, а другие - нет. Почему это?

Пример запроса:

query = '''
update `project.dataset.Table`
set my_fk = 1234
where other_fk = 222 and
  received >= PARSE_TIMESTAMP("%Y-%m-%d %H:%M:%S", "2018-01-22 05:28:12") and 
  received <= PARSE_TIMESTAMP("%Y-%m-%d %H:%M:%S", "2018-01-26 02:31:51")
'''

Пример кода:

job_config = bigquery.QueryJobConfig()
job_config.priority = bigquery.QueryPriority.BATCH

queries = [] # list of DML Strings
jobs = []
for query in queries:
    job = client.query(query, location='US', job_config=job_config)
    jobs.append(job)

Выход задания:

for job in jobs[1:]:
    print(job.state)
    # Done

    print(job.error_result)
    # {'message': 'Cannot set destination table in jobs with DML statements',
    # 'reason': 'invalidQuery'}

    print(job.use_legacy_sql)
    # False

    print(job.job_type)
    # Query

Ответы [ 2 ]

1 голос
/ 14 марта 2019

Я подозреваю, что проблема заключается в job_config получении некоторых полей (в частности, destination) с помощью API BigQuery после вставки первого задания.Затем второе задание не будет выполнено, поскольку это будет оператор DML с таблицей назначения в конфигурации задания.Вы можете проверить это с помощью:

for query in queries:
    print(job_config.destination)
    job = client.query(query, location='US', job_config=job_config)
    print(job_config.destination)
    jobs.append(job)

Чтобы решить эту проблему, вы можете избежать повторного использования одного и того же job_config для всех заданий:

for query in queries:
    job_config = bigquery.QueryJobConfig()
    job_config.priority = bigquery.QueryPriority.BATCH
    job = client.query(query, location='US', job_config=job_config)
    jobs.append(job)
1 голос
/ 14 марта 2019

Ваш код работает нормально при одном обновлении.Это то, что я пытался использовать Python 3.6.5 и v1.9.0 клиентского API

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

query = '''
UPDATE `project.dataset.table` SET msg = null WHERE x is null
'''

job_config = bigquery.QueryJobConfig()
job_config.priority = bigquery.QueryPriority.BATCH
job = client.query(query, location='US', job_config=job_config)

print(job.state)
# PENDING

print(job.error_result)
#  None

print(job.use_legacy_sql)
# False

print(job.job_type)
# Query

Пожалуйста, проверьте вашу конфигурацию и предоставьте полный код с журналом ошибок, если это не поможет вам решить вашу проблему

Кстати, я тоже это проверяю из командной строки

sh-3.2# ./bq query --nouse_legacy_sql --batch=true 'UPDATE `project.dataset.table` SET msg = null WHERE x is null'
Waiting on bqjob_r5ee4f5dd56dc212f_000001697d3f9a56_1 ... (133s) Current status: RUNNING
Waiting on bqjob_r5ee4f5dd56dc212f_000001697d3f9a56_1 ... (139s) Current status: DONE
sh-3.2#
sh-3.2# python --version
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...