使用Spark

时间:2018-03-06 04:07:41

标签: json hadoop apache-spark apache-spark-sql

我需要从大量有些复杂的嵌套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消息所产生的空值,反之亦然。这似乎非常低效,特别是一旦出现第三或第四个模式。我希望能够在第一次传递时正确解析消息并应用正确的模式。

1 个答案:

答案 0 :(得分:0)

正如我所看到的 - 只有一种方式:

  • 对于每种消息类型,您都可以创建一个'适配器'这将从输入创建数据框并将其转换为通用模式数据框
  • 然后是适配器的联合输出

显然,如果你改变了常见的'架构 - 您需要定制适配器'同样。