В веб-интерфейсе Google BigQuery, если я запускаю запрос, который возвращает слишком большой ответ, я получаю сообщение:
Ошибка: ответ слишком велик для возврата. Подумайте о том, чтобы установить для параметра allowLargeResults значение true в вашей конфигурации задания.
Как записать это сообщение об ошибке в интерфейсе API Google BigQuery при выполнении запроса, для которого не задано значение allowLargeResults в конфигурации задания?
В соответствующем API BigQuery — Работа: получить эта информация в status.errorResult
Соответственно в
reason
имущество: responseTooLarge
message
имущество: Ответ слишком велик, чтобы вернуться. Подумайте о том, чтобы установить для параметра allowLargeResults значение true в вашей конфигурации задания. Больше подробностей, …
Вы также можете проверить status.errors для более подробной информации обо всех ошибках, обнаруженных во время выполнения задания.
Мы используем этот фрагмент для обработки ошибок, и он помог:
У нас также есть, когда мы помещаем работу, и позже, когда мы проверяем статус работы в цикле, как эта ошибка всплывает, когда работа выполнена.
try {
try {
$job = $bq->jobs->insert(PROJECT_ID, $job);
} catch (Google_IO_Exception $e) {
$this->e('Exception: ' . $e->getMessage(), 'red');
$this->e('Strace: ' . $e->getTraceAsString());
if ($e->getMessage() == 'SSL connect error') {
$this->clearTokenFile();
$this->releaseJob();
}
return false;
}
$status = new Google_Service_Bigquery_JobStatus();
$status = $job->getStatus();
if (0 != $status->count()) {
$err_res = $status->getErrorResult();
$this->e($err_res->getMessage(), 'red');
return false;
}
} catch (Google_Service_Exception $e) {
$this->e('Exception: ' . $e->getMessage(), 'red');
return false;
}
и вставьте все у нас, здесь обратите внимание на reason
поле:
try {
$resp = new Google_Service_Bigquery_TableDataInsertAllResponse();
$resp = $bq->tabledata->insertAll($project_id, $dataset_id, static::tableId(), $request);
$errors = new Google_Service_Bigquery_TableDataInsertAllResponseInsertErrors();
$errors = @$resp->getInsertErrors();
if (!empty($errors)) {
$error_msg = "\r\nRequest Headers: \r\n" . json_encode($client->request->getRequestHeaders()) . "\r\nResponse Headers: \r\n" . json_encode($client->request->getResponseHeaders()) . "\r\nRequest Body:\r\n" . $client->request->getPostBody() . "\r\nResponse Body:\r\n" . $client->request->getResponseBody() . "\r\n";
if (is_array($errors)) {
foreach ($errors as $eP) {
$arr = $eP->getErrors();
$line = $eP->getIndex();
if (is_array($arr)) {
foreach ($arr as $e) {
switch ($e->getReason()) {
case "stopped":
break;
case "timeout":
$failed_lines[] = $line;
$last_reason = $e->getReason();
$error_msg.= sprintf("Timeout on line %s, reason: %s, msg: %s\r\n", $line, $e->getReason(), $e->getMessage());
break;
default:
$error_msg.= sprintf("Error on line %s, reason: %s, msg: %s\r\n", $line, $e->getReason(), $e->getMessage());
break;
}
}
} else {
$error_msg.= json_encode($arr) . "\r\n";
}
}
$this->setErrorMessage($error_msg);
} else {
$this->setErrorMessage($errors);
}
//print_r($errors);
//exit;
$success = false;
}
return $ret;
} catch (Google_Service_Exception $e) {
$this->setErrors($e->getErrors())->setErrorMessage($e->getMessage());
throw $e;
}
Отвечая на мой собственный вопрос: вот краткое изложение того, что решило это для меня. Таким образом, я не смог заставить его выдавать ошибку для синхронных запросов, но смог заставить его выдать ошибку для асинхронных запросов.
Вот пример запроса с ответом, слишком большим для возврата:
$query = "SELECT * FROM [publicdata:samples.github_timeline] LIMIT 1000000;"
Выполнение синхронного запроса с jobs.query:
try {
$query_request = new Google_Service_Bigquery_QueryRequest();
$query_request->setQuery($query);
$res = $this->gbq_service->jobs->query($this->_project_id, $query_request);
return $res;
} catch (Exception $e){
echo $e->getMessage());
}
Я получаю ответ:
{
"cacheHit": null,
"jobComplete": false,
"kind": "bigquery#queryResponse",
"pageToken": null,
"totalBytesProcessed": null,
"totalRows": null
}
Так что в этом случае я все еще не получаю желаемый «ответ, слишком большой, чтобы вернуться».
Если я запускаю задание как асинхронный запрос, статус задания в конечном итоге устанавливается на ГОТОВО, и при проверке результатов выдается сообщение об ошибке:
{
"error": "Error calling GET https://www.googleapis.com/bigquery/v2/projects/.../queries/job_2VICoK6yX0YMM_zRkJ10hT9mom8?timeoutMs=1000000&maxResults=100: (403) Response too large to return. Consider setting allowLargeResults to true in your job configuration. For more information, see https://cloud.google.com/bigquery/troubleshooting-errors",
}
Сообщая мне, что мне нужно сохранить результаты в виде таблицы и установить для свойства allowLargeResults значение true.
Итак, краткий ответ — запустите ваши запросы как асинхронные запросы.
Я связался с Google, и они упомянули, что это может быть ошибка в API PHP. Они сказали, что перешлют это людям php gbq API.