BigQuery - 我可以对查询运行查询吗?

时间:2016-10-27 08:40:25

标签: go pagination google-bigquery bigdata

背景

我正在开发一个管理系统网络应用程序。

在其中一个页面上,客户端显示一些聚合值的报告。 客户报告具有分页,排序和过滤功能。

服务器端是用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查询?

1 个答案:

答案 0 :(得分:2)

您可以设置destinationTable属性,甚至可以放置在单独的数据集中,您可以在其中设置默认的到期时间,例如整个数据集的1小时,2天或其他任何时间。这样,您在该数据集下创建的任何表都会自动过期。

通过这种方式,您可以控制所创建表格的名称,这样它就会自动过期,您无需构建脚本来删除它,也不会产生费用。