如何正确迭代所有 BigQuery 结果行?

     2023-03-25     98

关键词:

【中文标题】如何正确迭代所有 BigQuery 结果行?【英文标题】:How to correctly iterate over all BigQuery result rows? 【发布时间】:2017-08-25 11:27:37 【问题描述】:

我正在从 BigQuery 表中选择一列,例如

select url from `project.dataset.urllist` where status = 2

count(*) 给了我 245217 个结果,我可以在 浏览器控制台。

根据示例在 Java 中实现相同 https://cloud.google.com/bigquery/create-simple-app-api 看起来像

QueryResponse response = bigquery.query(queryRequest);
QueryResult result = response.getResult();

while (result != null) 
  for (List<FieldValue> row : result.iterateAll()) 
    ... do something
  
  result = result.getNextPage();

但是,我最终从 3 个 QueryResult 页面返回了 435651 个结果行。

我发现在 while 循环的第一次迭代中我已经得到了 所需的 245217 行;第二次和第三次迭代返回一个部分 同样的结果。 如果没有 while 循环,我会收到我所期望的,但这是正确的吗?

QueryResult result = response.getResult();
for (List<FieldValue> row : result.iterateAll()) 
  ... do something

显然,第一个结果页面包含从 #1 到 #245217 的所有行, 第二页包含从 #100000 到 #245217 的行, 第三页包含从 #200000 到 #245217 的行。 这是 API 中的错误吗?

【问题讨论】:

Javadoc for QueryResult 中的奇怪语言:Returns an iterator for all values, possibly also in the next pages 【参考方案1】:

从实际的角度来看,关于如何正确迭代所有 BigQuery 行的简短答案似乎是:

只需在当前版本的 Google Cloud Java Client Core (1.4.0) 和 BigQuery (0.22.0-beta) 中依赖 QueryResult#iterateAll();并通过结果页面删除该外循环。

考虑

让我们看一下QueryResultcom.google.cloud.PageImpl继承的iterateAll方法的实现。目前,此方法返回一个从当前页面开始的迭代器,一旦当前页面的所有元素都被迭代(github link),它似乎会获取下一页。这发生在相应的computeNext() 调用上,其中currentPage = currentPage.getNextPage(); 显式出现

也就是说,result.getNextPage().iterateAll() 返回迭代器,它从getNextPage 返回的页面的第一个元素开始迭代元素,并将迭代所有下一页,直到到达最后一页的最后一个元素。与result.iterateAll() 的唯一区别是最后一个返回从第一页开始的迭代器。

鉴于上述情况,将 result.iterateAll() 调用包装到页面中的附加循环是多余的,因此看起来 current version of example 不是 100% 一致的,需要删除周围的循环

while (result != null) 
  ...
  result = result.getNextPage();

就 API 本身的一致性而言 - 缺乏基于每页处理结果的明确方法,因为对于特定页面上的特定行,我们既没有 iterateAll 的替代品,也没有能力清楚地确定已到达当前页面的末尾(除了在迭代时手动计算行数的能力)。但是,当通过所有行处理整个结果时 - 这似乎不是一个障碍

编辑

请注意Java Client for BigQuery 在撰写本文时处于测试阶段,并且有明确说明:

注意:此客户端正在进行中,可能偶尔会进行向后不兼容的更改。

这意味着我们应该期待进一步的变化,并相应地调整处理所有行的方法。

【讨论】:

如何从“grep”中排除所有“permission denied”结果行?

】如何从“grep”中排除所有“permissiondenied”结果行?【英文标题】:HowcanIexcludeall“permissiondenied”resultlinesfrom“grep”?【发布时间】:2016-07-0104:41:54【问题描述】:所以,问题是,我在使用grep命令的linux终端上,我希望输出没... 查看详情

PL/SQL:, 如何将变量传递给 SELECT 语句并返回所有结果行

】PL/SQL:,如何将变量传递给SELECT语句并返回所有结果行【英文标题】:PL/SQL:,HowtopassvariableintoSELECTstatentandreturnallrowsofresults【发布时间】:2013-08-0121:16:23【问题描述】:我正在使用oracle数据库。我习惯使用SQL服务器,但不熟悉Oracle... 查看详情

如何在 Postgres 函数中检索多个结果行?

】如何在Postgres函数中检索多个结果行?【英文标题】:HowtoretrievemultipleresultrowsinaPostgresfunctions?【发布时间】:2019-10-3104:59:30【问题描述】:其实我只想使用下面的代码返回多个结果行。但是在调用函数时我只收到了一行结果集... 查看详情

在 sql developer 窗口中获取结果行

...尾显示“匿名块已完成”,现在无法理解结果行在哪里,如何获取它?谢谢【问题讨论】:【参考方案1】:我们在SQLDevelope 查看详情

如何计算查询结果行数?

】如何计算查询结果行数?【英文标题】:HowdoIcountqueryresultrows?【发布时间】:2022-01-2402:35:32【问题描述】:我应该将“查询结果行是否为1时验证的代码”替换为什么?我尝试了很多使用num_rows的方法,但它不起作用。我的PHP代... 查看详情

如何计算结果行数plsql

】如何计算结果行数plsql【英文标题】:Howtocountnumberofresultsrowsplsql【发布时间】:2019-11-2513:54:38【问题描述】:我在PLSQL中创建了这个查询,我必须检查一个操作需要多少时间。setline2222setpages0setfeedbackoffcolEVENTfora35colSQL_IDfora13colE... 查看详情

如何将 SQL 查询结果行作为具有不同标题名称的列? [关闭]

】如何将SQL查询结果行作为具有不同标题名称的列?[关闭]【英文标题】:HowcanIgetSQLqueryresultrowsascolumnswithdifferentheadernames?[closed]【发布时间】:2021-02-1308:05:06【问题描述】:SalesTypeNameSalesTypeCash500Visa1200我希望我的结果如下所示... 查看详情

如何在全范围内平均减少 SQL 查询的结果行?

】如何在全范围内平均减少SQL查询的结果行?【英文标题】:HowtoreduceresultrowsofSQLqueryequallyinfullrange?【发布时间】:2016-04-2921:49:50【问题描述】:我有与日期相关的值。例如,我需要选择10年的数据。标准查询结果大约有3000行,... 查看详情

将一列的多个结果行连接成一个,按另一列分组[重复]

...的桌子MovieActorA1A2A3B4我想获取电影的名称以及该电影中的所有演员,并且我希望结果采用如下格式:MovieActorList 查看详情

Python BigQuery - 如果行是新的并忽略重复的行,如何附加到表中

】PythonBigQuery-如果行是新的并忽略重复的行,如何附加到表中【英文标题】:PythonBigQuery-Howtoappendtoatableiftherowsarenewandignorerowsthatareduplicates【发布时间】:2020-03-3015:53:58【问题描述】:我正在使用一个调度程序,它每5分钟触发一... 查看详情

如何使用 Entity Framework Core 5.0 将复杂 SQL 查询的结果行映射到自定义 DTO?

】如何使用EntityFrameworkCore5.0将复杂SQL查询的结果行映射到自定义DTO?【英文标题】:HowdoImapresultrowsofcomplexSQLqueryintocustomDTOwithEntityFrameworkCore5.0?【发布时间】:2021-08-3009:46:28【问题描述】:我有一个自定义且有些复杂的SQL查询,... 查看详情

将结果行强制转换为对象

】将结果行强制转换为对象【英文标题】:Coerceresultrowintoobject【发布时间】:2011-01-0110:04:46【问题描述】:有没有办法将调用存储过程获得的结果行强制转换为特定对象,以便我可以只将该对象的列表传递到视图中?我知道我... 查看详情

需要根据值的顺序获取结果行

】需要根据值的顺序获取结果行【英文标题】:Needtofetchresultrowonbasisoforderofvalue【发布时间】:2022-01-2014:14:17【问题描述】:ItemNoDateItemTypeItemNoDateItemType1234512/17/2021High1234512/17/2021HIGH2345612/17/2021Low2345612/17/2021Low7890112/17/2021O 查看详情

Mysql UNION 方式与哪个表结果行不同

】MysqlUNION方式与哪个表结果行不同【英文标题】:MysqlUNIONwaytodifferfromwhichtableresultrowis【发布时间】:2020-06-0123:37:26【问题描述】:假设我有以下查询。SELECTCityFROMCustomersUNIONSELECTCityFROMSuppliersORDERBYCity;免得说两张桌子上都有同一... 查看详情

限制 PostgreSQL 最小时间间隔的结果行

】限制PostgreSQL最小时间间隔的结果行【英文标题】:LimitresultrowsforminimaltimeintervalsforPostgreSQL【发布时间】:2021-05-2310:02:55【问题描述】:背景:我正在运行TeslaMate/Grafana来监控我的汽车状态,其中一个仪表会绘制从数据库中获取... 查看详情

SQL Query - 在一个结果行中显示连接结果[重复]

】SQLQuery-在一个结果行中显示连接结果[重复]【英文标题】:SQLQuery-displayjoinresultinoneresultrow[duplicate]【发布时间】:2018-11-0216:05:55【问题描述】:我想创建一个基于一个表和其他表的高级搜索我的桌子:estate:+------+-------------+-----... 查看详情

SQL:多次重复结果行,并对行进行编号

】SQL:多次重复结果行,并对行进行编号【英文标题】:SQL:Repeataresultrowmultipletimes,andnumbertherows【发布时间】:2012-05-1212:27:00【问题描述】:我有一个SQL查询,结果如下:value|count------+------foo|1bar|3baz|2现在我想扩展它,以便count... 查看详情

在python sqlite中将结果行映射到namedtuple

】在pythonsqlite中将结果行映射到namedtuple【英文标题】:Mappingresultrowstonamedtupleinpythonsqlite【发布时间】:2013-04-2611:47:25【问题描述】:我正在使用sqlite3的pythonapi,我有一个用于存储语言的小表,其中包含id、name和creation_date字段... 查看详情