为什么 QueryResponse 没有 nextPageToken 属性

Why QueryResponse has no nextPageToken attribute

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

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

在上面的代码中,j 是一个 JobsResourceqr 是一个 QueryRequest 对象。

QueryResponse 有一个 pageToken 属性 是返回页面的标记。但是我怎样才能检索查询中的其他页面呢?我没有找到任何 nextPageToken 属性.

当我执行 JobsResource 对象的 List() 方法时,它有一个 nextPageToken 属性 但在上面的 Query() 方法中没有。

JobList jobList = j.List(Globals.ProjectId).Execute();

更新: 我正在阅读 Google BigQuery's related page for query 的文档。当我查看 JobRefrence 的描述时,它说:

Reference to the Job that was created to run the query. This field will be present even if the original request timed out, in which case GetQueryResults can be used to read the results once the query has completed. Since this API only returns the first page of results, subsequent pages can be fetched via the same mechanism (GetQueryResults).

因此,一旦我收到上面的回复,我就会 运行 GetQueryResults() 我的工作。

GetQueryResultsResponse r = j.GetQueryResults(projectId, response.JobReference.JobId).Execute();

但这给我的结果与我的回复相同。我怎样才能得到下一页? Google和"Same Mechanism"是什么意思?

QueryResponse 中,您可以访问 JobsReference,您可以在其中找到 JobIdProjectId(尽管您已经有了)。

您可以使用它们在您的 JobsResrouce 上调用 GetQueryResults 以生成下一页的新请求:

j.GetQueryResults(response.JobsReference.ProjectId,
                  response.JobsReference.JobId).Execute();

query / getQueryResults 方法用于将一些等待完成的作业推送到服务器中。使用此机制时,客户端可能会更快地收到作业完成通知,并将在该响应中收到查询结果的第一页,从而避免需要额外的往返行程来获取数据。

在伪代码中使用这些 api 的一般机制是:

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)

请注意,某些类型安全的语言将更难对此进行编码,因为该 do 循环中的第一个响应可能是 QueryResponseGetQueryResults 类型,具体取决于查询作业是否在 query() 调用的初始超时内完成,或者它是否在 while (!response.jobComplete) 轮询循环内完成。