2017-01-16 97 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"); 
    } 

エラーは、表が91列と約25,000行を持っているので、応答のための128MBの限界に近いどこにもあってはならないライン

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

で発生します。

すべてのStackoverflow質問を読み、すべてを試してみました。

答えて

2

指定された宛先テーブルに結果を書き込むクエリジョブを実行したいようです。しかし、あなたのループでは、それが呼び出されるたびにクエリ自体のgetQueryResultsを呼び出しています。will request all the resultsです。これが413の原因となっています。

私はこれが本当にやろうとしているとは思わないのです。

代わりに、をポーリングして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

おかげでグラハムが、私はすでにと違いはありません、私はそれが含ま、またはその悪い形でのショーするには、上記のコードを更新するだろうと試みましたか?もしそうなら私に知らせて、元に戻す。 また、その設定の変更は、リターンが128MB以上になると問題になります。これはどこにもありません。 – ChrisMonk

+1

秒待ってください。 'BigQuery.Jobs.getQueryResults(myProjectId、jobId); 'を実行して、実際のクエリの結果をワイヤでプルしようとしますか?これは本当にあなたがしたいことですか? –

+0

華麗!ありがとうございました! – ChrisMonk

関連する問題