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

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

巴照
2023-03-14

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

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

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

一些背景信息:

我们的数据以原型形式出现,我们根据原型buf模式更新更新我们的bigquery模式。

我知道一个显而易见的解决方案是不使用BigQuery,而只使用文档存储,但是我们使用Bigquery作为数据湖,也作为BI的数据仓库,并基于。所以我们有将原始数据聚集到服务Tableau的表中的工作。这里的第一个答案对我们来说不太适用,因为我们得到的数据可能被重复嵌套:big query:Create column of JSON datatype

共有2个答案

艾敏学
2023-03-14

我认为这个用例可以使用带有动态目标功能的数据流(或Apache Beam)来实现。数据流的步骤如下:

  1. 从pubsub读取事件/json
  2. 将事件展平,并在要插入BQ表的列上放置过滤器。
  3. 使用动态目的地,您将能够将数据插入到相应的表中(如果您有各种类型的各种事件)。在动态目的地中,您可以根据json中的字段动态指定架构
  4. 从动态目标中获取失败的插入记录,并根据您的用例(您观察此类问题的频率)在一些窗口之后将其写入特定事件类型的文件。
  5. 读取文件并更新架构一次并将文件加载到该BQ表

我已经在我的用例中实现了这个逻辑,它工作得很好。

陶锋
2023-03-14

你已经准备好了,你在你的问题中布局了几个选项。

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

  • 您可以使用分区表
  • 您可以将您的表集群

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

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

顺便说一句,您可以删除列,这是重新实现,您可以使用查询重写同一个表。您也可以重新实现以删除重复的行。

 类似资料:
  • 可能重复: 查找字符串中最长的重复序列 我正在解决一个问题,我需要找到重复最多的模式。 为了简单和方便,请考虑这个字符串: 重复次数最多的序列(例如,最初考虑字符串长度大于3个字符)是“Lorem Ipsum”。“Lorem”和“Ipsum”当然也重复相同的次数,但如果它们重复相同的次数,则较长的字符串优先于较短的字符串。 什么样的算法可以有效地找到这种模式,最好是在Python中?

  • 从BigQuery读取和过滤数据,我有两种方法 > 从 Dataflow 中的 BigQuery 读取(使用 BigqueryIO.readTableRow.from(ValueProvider)))整个数据,然后根据条件(如最大日期)进行筛选 使用NestedValueProvider通过生成仅获取所需数据的查询从数据流中的BigQuery读取要慢得多。 因为如果我读取整个数据并且我的表处于追加

  • 问题内容: 管理数据库更改的最佳方法是什么?无论数据库客户端的语言如何,我都需要一个解决方案。我还希望能够在那些更改中使用特定的数据库功能,例如存储过程,触发器等。 问题答案: 首先,请确保您已编写了完整的数据库构建脚本,以便可以根据需要重建数据库。 然后,应将每个更改写为更新脚本。这样,您可以针对数据库分别运行每个更改。 将更改提交到代码库后,将更改脚本与构建过程合并,使其自动发生…然后将更改脚

  • 目前,我的应用程序的某些部分在将大量数据加载到报告表时遇到了速度问题。报告表中的数据是从多个表中提取的,并运行一些复杂的查询,但这是必需的。 除了优化代码,我的问题是,您个人如何处理需要向用户显示的大量数据,最佳实践是什么? 目前我正在处理所有的数据,然后通过javascript库生成数据表。 我知道的事情: 用户不需要一次看到所有数据 用户需要能够搜索所有数据 用户需要能够过滤数据 最好的方法真

  • 我有一个可以很好地并行化的任务,所以我想使用多个线程来加速我的程序。但是,这并不像创建线程并让它们运行那么简单。线程必须重复执行某个任务,中间有中断,即伪代码如下所示: 这种情况非常频繁,准确地说是每秒60次。这就是为什么每次创建新线程都太慢了。我尝试用每个线程的状态变量(运行、暂停、停止)以及带有条件变量的类似事件的构造或轮询机制来解决这个问题。 这两个都只给了我大约两倍的速度,这并不像我想象的

  • 我想知道人们在bigquery上构建和管理ETL作业时发现了哪些最佳实践/工具。 目前,我有很多sql模板(可怕的参数化的lob,日期等使用sed类型字符串替换成一个tmp.sql文件,然后运行),我使用命令行工具来运行它们的序列并将输出发送到表。它工作正常,但有点笨拙。我仍然不明白为什么我不能在bigQuery上运行存储过程类型参数化脚本。甚至是某种图形用户界面来构建和管理管道。 我喜欢bigq