当我执行我的QueryRequest
对象时,我得到一个大约110,000的totalRows
,而响应行大约是38,000。所以我想我只收到第一页。
QueryResponse response = j.Query(qr, project).Execute();
在上面的代码中,j
是JobsResource
,qr
是QueryRequest
对象。
QueryResponse
具有pageToken
属性,该属性是返回页面的令牌。但是如何在查询中检索其他页面?我找不到任何nextPageToken
财产。
当我执行List()
对象的JobsResource
方法时,它具有nextPageToken
属性,但不在上面的Query()
方法中。
JobList jobList = j.List(Globals.ProjectId).Execute();
更新
我正在阅读Google BigQuery's related page for query的文档。当我查看JobRefrence
的说明时,它会说:
引用为运行查询而创建的作业。这个领域 即使原始请求超时,也将出现,在这种情况下 GetQueryResults可用于在查询后读取结果 完成。由于此API仅返回结果的第一页, 后续页面可以通过相同的机制获取 (GetQueryResults)。
因此,一旦我收到上述回复,我就会为我的工作运行GetQueryResults()。
GetQueryResultsResponse r = j.GetQueryResults(projectId, response.JobReference.JobId).Execute();
但这给了我与我的回答相同的结果。我怎样才能进入下一页?谷歌的含义是什么?"相同的机制" ?
答案 0 :(得分:1)
在QueryResponse
,您可以访问JobsReference
,在那里您可以找到JobId
和ProjectId
(虽然您已经拥有此内容)。
您可以使用这些来调用GetQueryResults
上的JobsResrouce
来为下一页生成新请求:
j.GetQueryResults(response.JobsReference.ProjectId,
response.JobsReference.JobId).Execute();
答案 1 :(得分:0)
query / getQueryResults方法用于将一些等待作业完成推送到服务器中。使用此机制时,客户端可能会看到更快的作业完成通知,并将在该响应中收到查询结果的第一页,从而无需另外一次往返获取数据。
在伪代码中使用这些apis的一般机制是:
import re
with open("filename.txt") as f:
for line in f:
if "form" in line:
re.findall('\d+', line)
请注意,某些类型安全的语言将更难以对此进行编码,因为该循环中的第一个响应可能是response = query(...)
while (!response.jobComplete) {
response = getQueryResults(response.jobReference);
}
moreData = false
do {
// consume response.rows
moreData = response.pageToken != null
if (moreData) {
response = getQueryResults(response.jobReference, response.pageToken)
}
} while (moreData)
或QueryResponse
类型,具体取决于查询作业是否在GetQueryResults
)调用的初始超时,或者是否在query(
轮询循环内完成。