Google cloud platform 当您希望继续使用分页检索结果时,在BigQuery表中进行分页的最佳方法是什么?
我正在从事一个分析项目,该项目运行查询并处理结果,每月将结果存储在表A中的BigQuery中。由于BigQuery不能用作事务查询,我们必须向用户显示此结果,因此我们决定将结果保存回on-prem SQl Server relationalDB(我们决定现在使用CloudSQL会非常昂贵,所以我们决定使用prem relationaldb)。我已决定使用分页从BQ中读取数据,并将结果保存回on prem relationalDB。但是,我似乎无法理解,因为这是一个每月的过程,每个月都会将数据附加到表a中,我如何知道下次读取结果时从何处开始?我不想重新读取以前读取的相同值。 我是否应该将pageToken保存在某个位置以便知道从何处开始?但是,我是否还需要保存jobIDGoogle cloud platform 当您希望继续使用分页检索结果时,在BigQuery表中进行分页的最佳方法是什么?,google-cloud-platform,google-bigquery,Google Cloud Platform,Google Bigquery,我正在从事一个分析项目,该项目运行查询并处理结果,每月将结果存储在表A中的BigQuery中。由于BigQuery不能用作事务查询,我们必须向用户显示此结果,因此我们决定将结果保存回on-prem SQl Server relationalDB(我们决定现在使用CloudSQL会非常昂贵,所以我们决定使用prem relationaldb)。我已决定使用分页从BQ中读取数据,并将结果保存回on prem relationalDB。但是,我似乎无法理解,因为这是一个每月的过程,每个月都会将数据附加
private void getMonthlyStats(String dataSetName, String table) {
// Identify the table itself
TableId tableId = TableId.of(dataSetName, table);
TableResult result = bigQuery.listTableData(tableId, BigQuery.TableDataListOption.pageSize(100));
do {
result.getValues().forEach(x-> {
// save the result back to relationalDB.
});
}while(result.getNextPageToken()!=null);
}
我想说的是,阅读这篇关于Nodejs中BigQuery分页的文章。我建议您创建一个每月计划的脚本/作业,它可以执行以下操作:
配置.query.destinationTable
我也建议你阅读更多关于你以前页面中的数据可能已经改变的场景。在这个场景中,你可以使用<代码> Etag < /Cord>属性。
< P>你的表数据是否包括一个可以用来过滤的时间戳?如果是这样,我会考虑直接使用,并且在创建RE时简单地设置一个过滤器。ad会话仅返回时间戳高于水印时间的行tabledata.list中的分页机制不适用于这种恢复/增量读取模式。每个时间窗口都需要单独的表才能以这种方式读取,或者需要一个时间分区表,在其中可以单独引用分区进行读取。我想您不想使用分页,因为存在不保证总是以相同的顺序返回行。理想情况下,插入的月度数据应附有某种日期。这样可以很容易地只选择自上次下载以来插入的数据。如果不是,我强烈建议您重新访问数据模型
您可能还想考虑按日期划分BigQueq表以降低成本并改善查询以提取数据的性能。
谢谢。):我的困惑更多的是在页面上,因为GETNEXPAGETCKEN将为NULL,在DB中保存空值,它将如何帮助我呢?您提到检索最后一个pageToken,但是在这种情况下它不是空的吗?感谢ERA的建议,但是我们不会更新任何数据,而是添加新的行,这将是最后一个不为null的pageToken。这是最后一页可能不完整的标记。然后还可以添加Etag属性,它充当页面的校验和。然后在下一次运行fetch该页面时,检查它是否已使用该Etag更改(可能已更改)。并更新或插入sql数据库,这样就不会再次插入任何重复项。然后继续下一页,直到它再次完成。它确实有一个与之关联的日期。我考虑过这种方法,基本上,我必须使用基于查询的分页。但是,它希望我根据文档()拥有一个临时表。我只是想避免那样做。但是,如果基于api的分页不起作用,那么我可能会采用这种方法。我们已根据月份对表进行分区,因此每月读取的数据将更少。我们已根据运行进程的月份对表进行分区。是的,我们支持基于月份的过滤。我们已经根据运行进程的月份对表进行了分区。我在考虑基于查询的分区方法,但是,它希望我创建一个我想要避免的临时表()。但我猜从上面的评论来看,我似乎只剩下基于查询的分区方法了。