【问题标题】:Querying across identical JSON_B nests with Keys in different case over time随着时间的推移,在不同情况下使用不同情况下的键查询相同的 JSON_B 嵌套
【发布时间】:2021-09-23 23:33:35
【问题描述】:

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

JSON to 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,将数据放到 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"}

直到非产品中的 ETL 开始出现错误行为,然后物化视图开始加载错误,我们才立即意识到这种影响,但事实证明,以前使用原始键/值对定义的查询不是即使字段名称或嵌套结构没有任何变化,也会被解析。

所以:

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

问题是我们现在在核心表中都有两组嵌套。我查看了 Firehose,它没有提供保留按键外壳的选项。

我可以使用 CASE 语句根据时间定义 mat view,因为有不同的切换日期,但我想知道如何处理跨越时间的查询,从切换到 firehose 之前和之后。

最初的想法是使用 COALESCE(message->>'ContactId', message->>'contactid') 但在尝试重构涉及跨各种嵌套级别的聚合的查询时,这很快就会变得丑陋。

关于如何以最佳方式解决此问题的任何想法。除了 mat 视图之外,我们还在触发器函数中查询此嵌套,从阶段到目标,再到将值转换为特定数据类型的位置,因此对于我们的某些批处理加载而言,所关注的合并可能在计算上过于密集。

任何想法/想法将不胜感激。

谢谢

【问题讨论】:

    标签: postgresql jsonb amazon-kinesis-firehose aws-aurora-serverless


    【解决方案1】:

    考虑到除了上游修正没有更好的选择,选择 COALESCE。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-08-07
      • 1970-01-01
      • 2017-02-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-03
      相关资源
      最近更新 更多