2017-01-16 2 views
1

Это проблема, которую трудно воспроизвести порой, но потом снова и снова всплывает, что заставляет меня думать, что это может быть связано с квотами, но я не вижу ни одного из они установлены на нашем счете.Google BigQuery: ошибка 413 Ответ слишком велик

var myQuery = 'SELECT * FROM [' + myProjectId + ':' + myDatasetId + '.' + historyTable + '] WHERE ID NOT IN (SELECT ID FROM [' + myProjectId + ':' + myDatasetId + '.' + federatedTable + '])' 

    // Overwrite the history table with a version with only the records that are NOT in federated 
    var job = { 
    configuration: { 
     query: { 
     query: myQuery, 
     maximumBillingTier: "2", 
     writeDisposition:'WRITE_TRUNCATE', 
     useQueryCache: true, 
     allowLargeResults: true, 
     destinationTable: { 
      projectId: myProjectId, 
      datasetId: myDatasetId, 
      tableId: historyTable 
     }} 
    }}; 

    var queryResults = BigQuery.Jobs.insert(job, myProjectId); 



var jobId = queryResults.jobReference.jobId; 



// Wait until that job completes 


// Check on status of the Query Job. 
    var sleepTimeMs = 500; 
    while (!queryResults.jobComplete) { 
    Utilities.sleep(sleepTimeMs); 
    queryResults = BigQuery.Jobs.getQueryResults(myProjectId, jobId); 
    Logger.log("Not Done"); 
    } 

Ошибка возникает на линии

queryResults = BigQuery.Jobs.getQueryResults(myProjectId, jobId); 

Таблица содержит 91 столбцов и около 25 000 строк, так не должно быть нигде вблизи границы 128mb для ответов.

Прочитайте каждый вопрос, который похож на Stackoverflow, и попробовал все!

ответ

2

Похоже, вы хотите запустить задание запроса, которое записывает результаты в указанную таблицу назначения. Однако в вашем цикле вы вызываете getQueryResults, который will request all the results самого запроса каждый раз, когда он вызывается. Это то, что вызывает 413.

Я не думаю, что это то, что вы действительно пытаетесь сделать.

Вместо этого попробуйте опросить job.status.state, чтобы получить job resource, чтобы определить, когда он будет готов. Это не приведет к потере всех результатов по проводам. Например:

function runQuery() { 
    var projectId = 'XXXXXX'; 
    var myQuery = 'SELECT TOP(word, 300) AS word, COUNT(*) AS word_count ' + 
     'FROM publicdata:samples.shakespeare WHERE LENGTH(word) > 10;' 

    var job = { 
    configuration: { 
     query: { 
     query: myQuery, 
     writeDisposition:'WRITE_TRUNCATE', 
     useQueryCache: true, 
     allowLargeResults: true, 
     destinationTable: { 
      projectId: 'XXXXXX', 
      datasetId: 'test', 
      tableId: 'test_table' 
     }} 
    }}; 

    var job = BigQuery.Jobs.insert(job, projectId); 
    Logger.log(job.status.state); 
    var jobId = job.jobReference.jobId; 

    // Check on status of the Query Job. 
    var sleepTimeMs = 500; 
    while (job.status.state !== 'DONE') { 
    Utilities.sleep(sleepTimeMs); 
    job = BigQuery.Jobs.get(projectId, jobId); 
    Logger.log(job.status.state); 
    } 
} 
+0

Спасибо Грэм, но я уже пробовал это и не имеет никакого значения, я обновлю код, чтобы показать, что он включен или эта плохая форма? Если да, дайте мне знать, и я отмене. Кроме того, это изменение конфигурации должно иметь значение только при условии, что возврат> 128 Мб сжат. Что это нигде рядом. – ChrisMonk

+1

Подождите секунду. «BigQuery.Jobs.getQueryResults (myProjectId, jobId);« попытайтесь вывести фактические результаты запроса по проводу? Это действительно то, что вы хотите сделать? –

+0

Блестящий! Спасибо! – ChrisMonk

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