【发布时间】:2018-08-13 20:41:06
【问题描述】:
我需要从大量复杂的嵌套 JSON 消息中收集一些关键信息,这些消息会随着时间的推移而演变。每条消息都引用相同类型的事件,但这些消息由多个生产者生成,并有两种(将来可能会更多)模式。每条消息的关键信息都是相似的,但到这些字段的映射取决于消息类型。
我无法分享实际数据,但这里是一个示例:
Message A
—header:
|—attribute1
|—attribute2
—typeA:
|—typeAStruct1:
||—property1
|-typeAStruct2:
||-property2
Message B
-attribute1
-attribute2
-contents:
|-message:
||-TypeB:
|||-property1
|||-TypeBStruct:
||||-property2
无论消息类型如何,我都想生成一个看起来像这样的数据表:
| MessageSchema | Property1 | Property2 |
| :———————————- | :———————— | :———————— |
| MessageA | A1 | A2 |
| MessageB | B1 | B2 |
| MessageA | A3 | A4 |
| MessageB | B3 | B4 |
我当前的策略是使用模式 A 读取数据,并与使用模式 B 读取的数据联合。然后我可以过滤使用 B 模式解析 A 类消息产生的空值,反之亦然。这似乎非常低效,尤其是在出现第三或第四模式时。我希望能够在第一遍正确解析消息并应用正确的架构。
【问题讨论】:
-
如果您想要随时间变化的数据,我可能会建议使用 Avro 而不是 JSON。
-
您的
few key pieces会随着时间的推移而变化,还是适用于所有未来消息的恒定模式? -
@VladislavVarslavans 这些信息也可能会发生变化。此外,不同的模式可能会以稍微不同的名称引用相同的值。
-
我有一个类似的情况,我设法通过首先通过 json rapture 读取 json 模式然后动态填充数据框的列来解决它。我也发布了一个答案here
标签: json hadoop apache-spark apache-spark-sql