2016-10-27 54 views
1

背景BigQuery - クエリに対してクエリを実行できますか?

私は管理システムWebアプリケーションを開発しています。

ページの1つで、クライアントはいくつかの集計値のレポートを表示します。 クライアントレポートには、ページ番号、ソート、およびフィルタリングがあります。

サーバー側はGoで書かれ、データはBigQueryの大きなデータセットに格納されます(各テーブルは1日分です)。サーバーコードは、ライブラリ "google.golang.org/api/bigquery/v2"を使用してBQと通信します。

実装

メイン・クエリは、私は、クエリを実行し、以降の呼び出しのためのジョブIDをキャッシュするQuery APIを使用して、多くの時間がかかるため。

query := &bigquery.QueryRequest{ 
     DefaultDataset: "myDataSet", 
     Kind:   "json", 
     Query:   queryStr, 
     UseQueryCache: true, 
    } 
qr, err := service.Jobs.Query(project, query).Do() 

// cache the job id 
key := getMD5Hash(queryStr) 
item := &memcache.Item{ 
    Key:  key, 
    Value:  []byte(qr.JobReference.JobId), 
    Expiration: time.Hour * 24, 
} 

err := memcache.Set(c.ctx, item) 

その後、私は、キャッシュされたジョブIDを使用して、データのページを取得するためにgetQueryResultsを使用しています。

qrc := service.Jobs.GetQueryResults(project, jobId) 
if maxResults > 0 { 
    qrc.MaxResults(int64(maxResults)) 
} 
qrc.StartIndex(uint64(startIndex)) 
qrslice, err := qrc.Do() 

質問

私はデータフィルタソートするが、基礎となる(重い)クエリを繰り返すことなくしたいです。元のクエリによって作成された一時テーブルに対して別のクエリを実行するオプションはありますか?

元のテーブルがAで、クエリを実行した結果、TEMP_JOBという一時テーブルが作成されました。 TEMP_JOBでSQLクエリを実行することは可能ですか?

答えて

2

destinationTableプロパティを設定し、デフォルトの有効期限を設定する別のデータセットに配置することもできます。たとえば、データセット全体に対して1時間、2日などを設定します。このようにして、そのデータセットで作成するテーブルは自動的に期限切れになります。

作成したテーブルの名前の名前を制御することで、自動的に期限が切れるため、スクリプトを作成して削除する必要はなく、コストをかけることもありません。

+0

これはまさに私がやったことです - ありがとう! – Lizozom

関連する問題