随着时间的推移,在具有不同大小写的Keys的相同JSON_B嵌套之间进行查询



我必须在JSON_b字段中存储多个字段,这些字段包含特定于呼叫中心应用程序的嵌套(3-5级(JSON。然后,我们根据我们的分析需求具体化视图,并将高管报告视图推送给Redshift。数据最初是从S3源获取的,该源是lambda函数的备份,该函数解析日志流并将其作为拼花放入S3

JSON到Parquet表加载了以下格式的数据:

{"ContactId": "val", "Timestamp": "2021-06-02T03:59:59.094Z", "Parameters": {"Text": "Para português, aperte três.", "Voice": "name", "Timeout": "3000", "MaxDigits": "1", "TextToSpeechType": "text"}, "ContactFlowId": "arn:-1993633fcebb", "ContactFlowModuleType": "GetUserInput"}

现在,随着上游移除lambda并放入Kinesis Firehose,将数据降落到镶木地板的同一位置,情况发生了变化。这些字段的新有效载荷如下所示:

{"contactid": "val", "timestamp": "2021-06-02T03:59:59.094Z", "parameters": {"text": "Para português, aperte três.", "voice": "name", "timeout": "3000", "maxdigits": "1", "texttospeechtype": "text"}, "contactflowid": "arn:-1993633fcebb", "contactflowmoduletype": "GetUserInput"}

我们并没有立即意识到这种影响,直到非产品中的ETL开始错误地运行,然后物化视图开始错误地加载,但事实证明,以前定义时考虑到原始键/值对的查询没有被解析,即使字段名或嵌套结构没有改变。

因此:

message->>'ContactId' is distinct from message->>'contactid'. 

问题是,我们现在在核心表中都有两套嵌套。我看了看消防软管,它没有提供在钥匙上保留箱子的选项。

我可以根据时间使用CASE语句来定义垫子视图,因为有不同的切换日期,但我想知道如何处理切换之前和之后的查询。

最初的想法是使用COALESCE(message->>'ContactId',message-&>>'联系人'(,但当试图重构涉及不同嵌套级别聚合的查询时,这很快就会变得很糟糕。

任何关于如何以最佳方式解决这一问题的想法。除了mat视图之外,我们还在触发器函数中从一个阶段到另一个目标查询这个嵌套,其中值被强制转换为特定的数据类型,因此对于我们的一些批加载来说,相关的合并可能在计算上过于密集。

任何想法都将不胜感激。

感谢

除了上游校正外,没有更好的选择。

最新更新