2016-10-27 67 views
1

背景BigQuery - 我可以在查詢上運行查詢嗎?

我正在開發一個管理系統的web應用程序。

在其中一頁上,客戶端顯示一些彙總值的報告。 客戶報告具有分頁,排序和過濾。

服務器端用Go編寫,數據存儲在BigQuery中的大型數據集中(每個表格爲一天)。服務器代碼使用庫「google.golang.org/api/bigquery/v2」與BQ進行通信。

實施

由於主查詢需要花費大量的時間,我用的是Query API來運行查詢並緩存的JobID後續調用。

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) 

然後我使用緩存的jobID,然後使用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

相關問題