当前位置: 首页 > 知识库问答 >
问题:

如何管理流向BigQuery分片表时的模式漂移

韦原
2023-03-14

我们是BigQuery的新用户,并试图找出使用它进行实时分析的最佳方式。我们正在从后端服务向Kafka发送一个日志流,我们希望使用流插入将这些日志流传输到BigQuery。对于可查询性,我们既按时间划分,又按事件类型划分表(用于通配符查询)。我们将一个视图放在所创建的表族的顶部,使它们看起来像一个表,并使用_TABLE_SUFFIX(当它们推出这个特性时,现在使用UNION ALL)和_PARTITIONTIME列来减少为查询而扫描的行集。到目前为止一切顺利。

我们不确定如何正确处理的是模式变化。我们的日志消息的模式经常改变。手动保持BigQuery同步是不可行的。理想情况下,我们的流管道会检测到这种变化,并在必要时应用模式更新(用于添加列)或表创建(用于添加事件类型)。我们有工具上游,所以我们知道所有的模式更新将是向后兼容的。

我的理解是,所有碎片必须具有相同的模式。我们如何以如下方式应用模式更新:

  1. 我们不会中断在更新期间运行的查询。
  2. 我们不会破坏流式插入。

#1可能吗?我不相信我们可以原子地更改所有分片表的模式。

对于#2,我假设我们必须在模式更新过程中停止流式管道。

谢谢, --本

共有1个答案

邓建柏
2023-03-14

具有_TABLE_SUFFIX的通配符表可用https://cloud.google.com/bigquery/docs/querying-wildcard-tables即使表的模式不同,您也可以使用它,它们只需要具有兼容的模式。使用UNION ALL,您需要所有表都具有相同的模式,因此如果您同时更新模式,它将无法工作。如果您只指定字段的子集,流插入也可以工作。但是您不能将新字段作为流插入的一部分添加,您必须先更新表,然后使用新模式插入数据。

 类似资料:
  • 在用Python编写BigQuery之前,如何在数据流作业中处理此逻辑?

  • 我正在寻找更新BigQuery中现有表的模式的方法。我可以在python中看到同样的操作,这是一个API请求。我想在Java中看到这一点,并查看我能找到的文档和源代码 但是它重写了整个模式。在这里可以找到其他可能的更新模式的方法 有人能指导我如何使用Java在BigQuery中向现有表添加新列吗?

  • 我有两个BigQuery数据集:和 这些数据集中的每一个都包含一个表,例如和 包含流数据,我想将数据从流式传输到。 我有类型的架构。如何将流行从一个表复制到另一个表并保留现有架构? 到目前为止,我已经研究了BigQuery的insertAll方法,但是我有点不确定在哪个数据结构中获取行,以及在插入新表时如何指定TableSchema。 我希望能就如何做到这一点提供一些指导。谢谢

  • 众所周知,Flink有两个核心API(数据流/数据集),但当我使用Flink Sql客户端提交作业时,我不需要选择流或批处理模式。所以,Flink SQL客户机是如何决定使用批处理模式和流模式的。我在官方文件中没有找到答案。所以,我想知道Flink SQL客户端如何区分批处理模式和流模式?

  • 由于我刚接触DataFlow/Beam,概念还不太清楚(或者至少我在开始编写代码时有困难),我有很多问题: 什么是最好的模板或模式,我可以用来做到这一点?我应该先执行BigQuery的PTransform(然后执行PubSub的PTransform)还是先执行PubSub的PTransform? 我怎么做加入?比如? PubSub的最佳窗口设置是什么?BigQuery的PTransform部分的窗

  • 我有一个连续接收流插入的表(可能每秒数千个)。 我对使用更新功能(通过API调用)添加列感兴趣。我可以在数据仍在插入时调用Update将列添加到现有表中,而无需担心数据丢失吗? 作为参考,这是我计划用于向表中添加列的代码: