用于频繁更改表结构的 ETL

Posted

技术标签:

【中文标题】用于频繁更改表结构的 ETL【英文标题】:ETL for a frequently changing Table structure 【发布时间】:2018-01-15 23:26:09 【问题描述】:

场景

我有一个维护交易数据的源。他们有大约 900 列,并且根据新业务的要求,他们添加了额外的列。

我们是一个 BI 团队,我们只提取报告所需的大约 200 列。但是当新业务启动/需要新分析时,有时用户会找我们并要求我们从源中提取额外的列。

当前设计:

我们还为未来的列创建了一个包含额外列的表。 我们正在维护一个 400 列的表,其中包含未来的列名,如 str_01、str_02....、numer_01、numer_02...date_01、date_02...等。

我们有一个映射表,它映射表中的列和源表中的列。使用这个映射表,我们从源中提取数据。

问题:

最近,我们的表已达到 400 列的限制,我们将无法加入任何新列。我们可以实施的一种方法是修改表以将列增加到 500(或 600),但我正在寻找其他解决方案,了解如何为这些场景实施 ETL/设计表结构。

【问题讨论】:

Redshift 标准限制为 1600 列和 400 个排序键列。您的每个列都必须是排序键是否有原因?仅对代表所需“行”的必要复合键的列进行排序。另一种选择是切换到非规范化和无模式的不同架构 (NoSQL)。 EMR 支持 Cassandra 和 HBase。 @cowbert ,400 列限制,我的意思是我们已经用尽了我们为将来使用而创建的所有额外列。它们不是排序键的一部分。我们的排序键是用户过滤的日期列。我也对 NoSQL 持开放态度,但除此之外我们还需要一个报告解决方案。不确定 NoSQL 是否支持报告解决方案。 【参考方案1】:

我想您的附加列是度量,而不是维度。因此,您可以将维度保留在各个列中,并将它们包含在排序键中,并将度量存储在 JSON 中,以便在需要时访问它们。此外,如果您可以区分常用度量与偶尔度量,您可以将常用度量存储在列中,将偶尔使用的度量存储在 JSON 中。 Redshift 原生支持提取给定键的值,您还可以设置 Python UDF 以进行更复杂的处理。

【讨论】:

嗨,亚历克斯,感谢您的回答。这真的很有帮助。因此,如果我理解正确,我需要将所有常用列存储为单独的列,并将所有其他属性作为 JSON 字符串。这里有几个问题:1)JSON字符串的数据类型是Redshift中的varchar,对吗? 2) 在我们提取大约 100 万条记录的情况下,这种方法是否适用于批处理或报告? @KishoreKumar 1) 是的,它是 varchar。要获取该值,请使用 extract_json_path_text 函数并将输出转换为某种数字数据类型。 2)只要您的过滤、排序和分组是有效的(您正在使用排序/分布键并且不进行需要在节点之间进行随机播放的连接),json 键的聚合应该没问题。如果您测试并提供反馈,我将不胜感激。 嗨,Alex,我在 Hive 中尝试了这种方法,以下是我注意到的几件事:1) Hive 没有连接运算符 (||)。我们需要使用 CONCAT 函数从列中生成 JSON 字符串。这变得太复杂了,尤其是当我计划从 100 多列创建 JSON 字符串时。 2)在连接时,我们需要处理也可以有 NULLS 的列。否则整个 JSON 字符串将变为 NULL。我打算创建一个 UDF 来在 Hive 中生成 JSON 字符串。如果您有任何其他建议,请告诉我。 @KishoreKumar 我建议的方法是用于 Redshift... 在 Hive 中可能有效***.com/questions/16009608/…

以上是关于用于频繁更改表结构的 ETL的主要内容,如果未能解决你的问题,请参考以下文章

开发 --> 生产服务器(用于更改表结构的脚本)

在线更改表结构pt-onling-schema-change

使用 ETL 中的表连接更改数据捕获

Hive 到 Hive ETL

mysql 更改表结构

hbase - 如何在不删除表的情况下更改表结构