BigQuery:处理频繁的架构变更的最佳方法?

时间:2019-03-08 17:55:46

标签: google-bigquery jsonb

我们的BigQuery架构被大量嵌套/重复并且不断变化。例如,网站的新页面,表单或用户信息字段将与BigQuery中的新列相对应。另外,如果我们停止使用某种形式,则相应的不赞成使用的列将永远存在,因为您无法删除Bigquery中的列。

因此,我们最终将产生具有数百列的表,其中许多列已弃用,这似乎不是一个好的解决方案。

我正在寻找的主要替代方法是将所有内容存储为json(例如,每个Bigquery表将只有两列,一列用于时间戳,另一列用于json数据)。然后,我们每10分钟运行一次的批处理作业将执行联接/查询并写入聚合表。但是使用这种方法,我担心增加查询工作成本。

一些背景信息:

我们的数据以protobuf的形式出现,并且我们根据protobuf模式更新来更新bigquery模式。

我知道一个显而易见的解决方案是不使用BigQuery而是仅使用文档存储,但是我们将Bigquery用作数据湖和BI以及构建Tableau报告的数据仓库。因此,我们的工作将原始数据聚合到为Tableau服务的表中。 此处的最佳答案对我们而言效果不佳,因为我们获得的数据可能大量重复出现:BigQuery: Create column of JSON datatype

2 个答案:

答案 0 :(得分:3)

您已经准备好了,可以在问题中安排几个选项。

您可以使用JSON表并保持低成本

  • 您可以使用分区表
  • 您可以对表格进行群集

因此,我不仅要添加两个timestamp + json列,还要添加1个分区列和5个集群列。最终甚至使用年度后缀表。这样,您至少有6个维度可以仅扫描有限数量的行以进行重新实现。

另一种方法是更改​​模型,并在中间层进行事件处理。您可以先将所有事件连接到Dataflow或Pub / Sub,然后在那里进行处理,并以新模式写入bigquery。该脚本将能够使用您在引擎中编写的模式即时创建表。

您可以删除列,即重新实现,也可以使用查询重写同一张表。您也可以重新实现以删除重复的行。

答案 1 :(得分:0)

我认为可以使用具有Dynamic Destination功能的Dataflow(或Apache Beam)来实现此用例。数据流的步骤如下:

阅读

  1. pubsub中的事件/ json
  2. 展平事件并将过滤器放在要插入BQ表中的列上。
  3. 动态的,它将数据插入到相应的表中 (如果您有各种类型的各种事件)。在动态目的地 您可以根据自己的字段即时指定架构 json
  4. 从动态列表中获取failed insert记录 目标并将其写入以下特定事件类型的文件 一些窗口
  5. 读取文件并更新一次架构,然后将文件加载到该BQ表中