使用 运行 数据仓库使存档数据模式保持最新

Keeping archived data schema up to date with running data warehouse

最近我们使用了 5 年的 MySQL 数据仓库(主要用于业务报告)已经满了,我们需要想出一种方法来归档不经常访问的旧数据以进行清理space.

我创建了一个进程,将旧数据从 DW 转储到 Amazon S3 中的 .parquet 文件中,然后将其映射到 Athena table。这很好用。

然而,我们有时会在现有 table 中添加 add/rename/delete 列。我希望这些更改也能反映在旧的存档数据中,但如果不重新处理整个数据集,我想不出一个好的方法。

是否有 'canon' 方法来保持实时数据仓库与其基于文件的存档数据之间的结构兼容性?我用谷歌搜索了相关文献,但一无所获。

我是否应该接受这样一个事实,即如果我需要主动维护模式,那么数据并不是真正的 archived

如果你在大数据 space 中搜索 "Schema evolution" 一词,互联网上有大量资料。

Athena 文档中有一个章节是关于模式更新的,具体案例 here

如果您要重新处理整个存档数据集以处理模式更改,可能您做的有点太多了。

由于您有镶木地板文件,并且默认情况下 Athena 镶木地板按列名而不是索引解析列,因此在几乎所有情况下您都是安全的,即添加新列、删除列等,列重命名除外。要处理重命名的列(以及处理 addition/dropping 列),最快的方法是使用视图。在视图定义中,您可以为重命名的列添加别名。此外,如果列重命名主要是您的架构演变的情况,并且您经常这样做,您还可以考虑使用 AVRO 来优雅地处理它。

方案A:

这样做已经太晚了,但是 PARTITIONing 是从 table 中获取数据 的绝佳工具。

我说 "too late" 因为添加分区需要足够的 space 来复制已经很大的 table。而且你没有那么多磁盘 space?

如果 table 按年、季度或月划分,您可以

  • 每个周期,"Export tablespace" 从分区方案中删除最旧的。
  • 那 tablespace 将是一个单独的 table;你可以 copy/dump/whatever,然后放弃它。

大约在同一时间,您将构建一个新分区来接收新数据。

(我会把这两个过程分开,这样你就可以用最少的额外努力延长到 5 年以上或缩短到 5 年以下。)

该方法的一个好处是在处理过程中对大 table 的影响几乎为零。

分区的额外好处:您实际上可以 return space 到 OS(假设您有 innodb_file_per_table=ON)。

方案B:

看看你对 ooool 数据做了什么。只有几样东西?可能涉及总结?所以...

  • 不要存档旧数据。
  • 将要删除的数据汇总到新的table中。由于它们的大小可能只有原来的十分之一,因此您可以让它们在线 'forever'.