Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/wordpress/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud platform 当您希望继续使用分页检索结果时,在BigQuery表中进行分页的最佳方法是什么?_Google Cloud Platform_Google Bigquery - Fatal编程技术网

Google cloud platform 当您希望继续使用分页检索结果时,在BigQuery表中进行分页的最佳方法是什么?

Google 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。但是,我似乎无法理解,因为这是一个每月的过程,每个月都会将数据附加

我正在从事一个分析项目,该项目运行查询并处理结果,每月将结果存储在表A中的BigQuery中。由于BigQuery不能用作事务查询,我们必须向用户显示此结果,因此我们决定将结果保存回on-prem SQl Server relationalDB(我们决定现在使用CloudSQL会非常昂贵,所以我们决定使用prem relationaldb)。我已决定使用分页从BQ中读取数据,并将结果保存回on prem relationalDB。但是,我似乎无法理解,因为这是一个每月的过程,每个月都会将数据附加到表a中,我如何知道下次读取结果时从何处开始?我不想重新读取以前读取的相同值。

我是否应该将pageToken保存在某个位置以便知道从何处开始?但是,我是否还需要保存jobID

 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分页的文章。我建议您创建一个每月计划的脚本/作业,它可以执行以下操作:

  • 向Bigquery提交作业
  • 设置
    配置.query.destinationTable
  • 调查工作是否完成
  • 翻页查看目标表中的结果
  • 插入或更新relationalDB中的行
  • 当pageToken为null时,运行完成
  • 将最后一个已知的pageToken和Etag保存到某个位置(例如,在relationalDB中)
  • 下次运行作业时,请检索最后一个pageToken
  • 使用该pageToken启动相同的查询
  • 您可以使用Etag检查最后一页是否已更改。但是,在relationalDB中进行插入或更新已经可以减少重复
  • 我建议您创建一个包含50行的小测试表。然后按上述方式运行作业。然后追加50行并再次运行作业,看看会发生什么


    我也建议你阅读更多关于你以前页面中的数据可能已经改变的场景。在这个场景中,你可以使用<代码> Etag < /Cord>属性。

    < P>你的表数据是否包括一个可以用来过滤的时间戳?如果是这样,我会考虑直接使用,并且在创建RE时简单地设置一个过滤器。ad会话仅返回时间戳高于水印时间的行


    tabledata.list中的分页机制不适用于这种恢复/增量读取模式。每个时间窗口都需要单独的表才能以这种方式读取,或者需要一个时间分区表,在其中可以单独引用分区进行读取。

    我想您不想使用分页,因为存在不保证总是以相同的顺序返回行。理想情况下,插入的月度数据应附有某种日期。这样可以很容易地只选择自上次下载以来插入的数据。如果不是,我强烈建议您重新访问数据模型


    您可能还想考虑按日期划分BigQueq表以降低成本并改善查询以提取数据的性能。

    谢谢。):我的困惑更多的是在页面上,因为GETNEXPAGETCKEN将为NULL,在DB中保存空值,它将如何帮助我呢?您提到检索最后一个pageToken,但是在这种情况下它不是空的吗?感谢ERA的建议,但是我们不会更新任何数据,而是添加新的行,这将是最后一个不为null的pageToken。这是最后一页可能不完整的标记。然后还可以添加Etag属性,它充当页面的校验和。然后在下一次运行fetch该页面时,检查它是否已使用该Etag更改(可能已更改)。并更新或插入sql数据库,这样就不会再次插入任何重复项。然后继续下一页,直到它再次完成。它确实有一个与之关联的日期。我考虑过这种方法,基本上,我必须使用基于查询的分页。但是,它希望我根据文档()拥有一个临时表。我只是想避免那样做。但是,如果基于api的分页不起作用,那么我可能会采用这种方法。我们已根据月份对表进行分区,因此每月读取的数据将更少。我们已根据运行进程的月份对表进行分区。是的,我们支持基于月份的过滤。我们已经根据运行进程的月份对表进行了分区。我在考虑基于查询的分区方法,但是,它希望我创建一个我想要避免的临时表()。但我猜从上面的评论来看,我似乎只剩下基于查询的分区方法了。