【问题标题】:Parsing multiple JSON schemas with Spark使用 Spark 解析多个 JSON 模式
【发布时间】: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


【解决方案1】:

在我看来 - 只有一种方法:

  • 为每种消息类型创建一个“适配器”,该适配器将从输入创建数据帧并将其转换为通用模式数据帧
  • 然后联合适配器的输出

显然,如果您更改“通用”架构 - 您还需要定制“适配器”。

【讨论】:

    猜你喜欢
    • 2017-02-16
    • 2016-11-01
    • 2021-11-03
    • 2020-01-19
    • 2017-09-11
    • 2020-01-18
    • 2021-09-24
    • 2011-08-05
    • 2017-03-18
    相关资源
    最近更新 更多