背景
我正在开发一个管理系统网络应用程序。
在其中一个页面上,客户端显示一些聚合值的报告。 客户报告具有分页,排序和过滤功能。
服务器端是用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查询?
答案 0 :(得分:2)
您可以设置destinationTable
属性,甚至可以放置在单独的数据集中,您可以在其中设置默认的到期时间,例如整个数据集的1小时,2天或其他任何时间。这样,您在该数据集下创建的任何表都会自动过期。
通过这种方式,您可以控制所创建表格的名称,这样它就会自动过期,您无需构建脚本来删除它,也不会产生费用。