为什么QueryResponse没有nextPageToken属性

时间:2015-09-23 11:21:14

标签: c# google-api google-bigquery

当我执行我的QueryRequest对象时,我得到一个大约110,000的totalRows,而响应行大约是38,000。所以我想我只收到第一页。

QueryResponse response = j.Query(qr, project).Execute();

在上面的代码中,jJobsResourceqrQueryRequest对象。

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();

但这给了我与我的回答相同的结果。我怎样才能进入下一页?谷歌的含义是什么?"相同的机制"

2 个答案:

答案 0 :(得分:1)

QueryResponse,您可以访问JobsReference,在那里您可以找到JobIdProjectId(虽然您已经拥有此内容)。

您可以使用这些来调用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(轮询循环内完成。