Python 针对频繁变化的表结构的ETL

Python 针对频繁变化的表结构的ETL,python,amazon-redshift,etl,emr,amazon-emr,Python,Amazon Redshift,Etl,Emr,Amazon Emr,场景: 我有一个维护事务数据的源。他们有大约900个专栏,根据新业务的需求,他们增加了额外的专栏 我们是一个BI团队,我们只提取报告所需的大约200列。但当启动新业务/需要新的分析时,有时用户会联系我们,要求我们从源代码中提取额外的列 当前设计: 我们已经为将来的列创建了一个包含额外列的表。 我们正在维护一个400列的表,其中包含未来的列名,如str_01、str_02….、numer_01、numer_02。。。日期01,日期02。。。等等 我们有一个映射表,它映射表中的列和源表中的列。使用这

场景

我有一个维护事务数据的源。他们有大约900个专栏,根据新业务的需求,他们增加了额外的专栏

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

当前设计:

我们已经为将来的列创建了一个包含额外列的表。 我们正在维护一个400列的表,其中包含未来的列名,如str_01、str_02….、numer_01、numer_02。。。日期01,日期02。。。等等

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

问题:


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

我认为您的附加列是度量,而不是维度。因此,您可以将维度保存在各个列中,并将它们包含到排序键中,并将度量值存储在JSON中,以便在需要时随时访问它们。此外,如果您能够区分常用度量值和偶尔度量值,那么您可以将常用度量值存储在列中,而偶尔度量值存储在JSON中。Redshift本机支持提取给定键的值,并且您还可以设置Python UDF以进行更复杂的处理。

Redshift标准限制为1600列和400个sortkey列。您的每一列都必须是sortkey有什么原因吗?仅sortkey表示所需“行”的必要组合键的列。另一种选择是切换到非规范化和无模式的不同体系结构(NoSQL)。EMR支持Cassandra和HBase。@cowbert,按400列限制,我的意思是我们已经用完了为将来使用而创建的所有额外列。它们不是排序键的一部分。我们的排序键是用户筛选的日期列。我也对NoSQL持开放态度,但除此之外,我们还需要一个报告解决方案。不确定NoSQL是否支持报告解决方案。嗨,Alex,谢谢你的回答。这真的很有帮助。因此,如果我理解正确,我需要将所有常用列存储为单独的列,并将所有其他属性存储为JSON字符串。这里有几个问题:1)JSON字符串的数据类型是红移的varchar,对吗?2) 你知道这种方法是如何用于批量处理或报告的吗?我们提取了大约100万条记录。@KishoreKumar 1)是的,它是varchar。要获取值,可以使用
extract\u json\u path\u text
函数并将输出转换为某种数字数据类型。2) 只要您的过滤、排序和分组是有效的(您使用的是sort/dist键,而不是需要在节点之间洗牌的连接),json键的聚合就应该是好的。如果您能在您这边进行测试并提供反馈,我将不胜感激。嗨,Alex,我在Hive中尝试了这种方法,下面是我注意到的几件事:1)Hive没有连接运算符(| |)。我们需要使用CONCAT函数从列生成JSON字符串。这变得太复杂了,尤其是当我计划从100多列创建JSON字符串时。2) 在连接时,我们需要处理也可以有null的列。否则整个JSON字符串将变为空。我计划创建一个UDF来在配置单元中生成JSON字符串。如果您有任何其他建议,请告诉我。@KishoreKumar我建议的方法是针对红移。。。在蜂箱里可能会有用