代码之家  ›  专栏  ›  技术社区  ›  gunit

BigQuery:处理频繁模式更改的最佳方法?

  •  0
  • gunit  · 技术社区  · 6 年前

    我们的BigQuery模式大量嵌套/重复,并且不断变化。例如,网站的新页面、表单或用户信息字段将对应于BigQuery中的新列。另外,如果我们停止使用某个表单,相应的不推荐列将永远存在,因为您不能在Bigquery中删除列。

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

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

    一些背景信息:

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

    我知道一个明显的解决方案是不使用BigQuery而只使用文档存储,但是我们将BigQuery用作数据湖,也用作BI的数据仓库,并在其上构建Tableau报告。所以我们的工作是将原始数据聚合到为Tableau服务的表中。 这里最重要的答案对我们来说不太适用,因为我们得到的数据可能会被大量重复嵌套: BigQuery: Create column of JSON datatype

    0 回复  |  直到 6 年前
        1
  •  3
  •   Pentium10    6 年前

    你已经做好了充分的准备,在你的问题中你布置了几个选项。

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

    • 可以使用分区表
    • 你可以把你的桌子聚在一起

    因此,我将添加1个分区列和5个集群列,而不是只有两个timestamp+json列。最终甚至使用每年的后缀表。这样,您至少有6个维度只扫描有限数量的行进行重新材质化。

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

    顺便说一句,你可以删除列,这是重物质化,你可以重写同一个查询表。也可以重新材质以删除重复的行。

        2
  •  0
  •   Bhavesh Shah    5 年前

    我认为这个用例可以通过使用Dataflow(或apachebeam)和 Dynamic Destination 它的特点。数据流的步骤如下:

    阅读

    1. 来自pubsub的事件/json
    2. 展平事件并对要插入BQ表的列设置筛选器。
    3. 动态的,将数据插入到相应的表中 (如果您有各种类型的事件)。动态目的地 您可以根据数据库中的字段动态指定模式 json文件
    4. 去拿那个 failed insert 动态数据库中的记录 并将其写入以下特定事件类型的文件 一些窗户
    5. 读取文件并更新模式一次,然后将文件加载到BQ表中