BigQuery 最终一致性保证使用流式插入 API
BigQuery eventual consistency guarantees using streaming insert API
我想使用 BigQuery streaming insert API 将行插入 BigQuery table。在我的用例中,这是将要执行的 "write" 中唯一的 class 操作;我永远不会通过任何其他方式插入行,也永远不会更新或删除行。
阅读 Life of a BigQuery streaming insert 后,我的理解是即使 insertAll
请求已被确认,后续的读取操作可能不会 "see" 所有成功的行由它插入,直到它们从流缓冲区传输到托管存储中。
假设我的理解是正确的(如果不正确请告诉我!):
- 有什么方法可以判断给定
insertAll
请求插入的所有行现在都已提交到托管存储吗?
- 即使在一行已提交到托管存储之后,后续读取操作是否保证要么看到它们,要么失败?
我为什么要问这些问题?我的 table 架构将包含一个 "key" 列,这是一个严格单调递增的标识符。所有读取操作都将被限制在其键不超过某个指定值的行中。我需要保证这种形式的读取操作总是 return 相同的结果,假设指定的键对应于已经插入的行。显然,随后 插入的行不可能被这样的查询 return 编辑(因为它们的键将大于指定的键)。但是,如果有任何行 already 已插入但仍在流式缓冲区中,查询可能不会 return 它们,但稍后执行完全相同的查询(之后行已提交)would return 它们。在我的用例中,这将是一场灾难。
有两种状态。
在流缓冲区中并已提交。
您可以读取流缓冲区中的行,这种语法在非分区表和分区表之间有所不同,您可以找到如何获取这些行的示例。
如果 insertId 被不止一行使用,则只有一行被保留。
已提交状态保证您可以阅读。
我想使用 BigQuery streaming insert API 将行插入 BigQuery table。在我的用例中,这是将要执行的 "write" 中唯一的 class 操作;我永远不会通过任何其他方式插入行,也永远不会更新或删除行。
阅读 Life of a BigQuery streaming insert 后,我的理解是即使 insertAll
请求已被确认,后续的读取操作可能不会 "see" 所有成功的行由它插入,直到它们从流缓冲区传输到托管存储中。
假设我的理解是正确的(如果不正确请告诉我!):
- 有什么方法可以判断给定
insertAll
请求插入的所有行现在都已提交到托管存储吗? - 即使在一行已提交到托管存储之后,后续读取操作是否保证要么看到它们,要么失败?
我为什么要问这些问题?我的 table 架构将包含一个 "key" 列,这是一个严格单调递增的标识符。所有读取操作都将被限制在其键不超过某个指定值的行中。我需要保证这种形式的读取操作总是 return 相同的结果,假设指定的键对应于已经插入的行。显然,随后 插入的行不可能被这样的查询 return 编辑(因为它们的键将大于指定的键)。但是,如果有任何行 already 已插入但仍在流式缓冲区中,查询可能不会 return 它们,但稍后执行完全相同的查询(之后行已提交)would return 它们。在我的用例中,这将是一场灾难。
有两种状态。
在流缓冲区中并已提交。 您可以读取流缓冲区中的行,这种语法在非分区表和分区表之间有所不同,您可以找到如何获取这些行的示例。
如果 insertId 被不止一行使用,则只有一行被保留。
已提交状态保证您可以阅读。