我的 xml 数据库包含这样的数据:
<events>
<event id="123">
<location>ABC</location>
<subsystem>Storage</subsystem>
<warning>
<date>2014-04-01</date>
<text>warning1<text/>
</warning>
<warning>
<date>2014-04-02</date>
<text>warning2<text/>
</warning>
<warning>
<date>2014-04-03</date>
<text>warning3<text/>
</warning>
</event>
....
</events>
数据量越来越大,想转用Hadoop处理。假设对于每个事件,我想添加一个额外的节点:
如何在 Hadoop 中存储结构化数据?我可以将它保存在 xml 中,但我没有看到任何具有原生 xml/json 支持的工具(pig 支持 json,但没有列表)。我可以按列将其拆分为不同的文件(一个用于事件,一个用于警告,然后通过事件 ID 加入它们),但是有很多子节点(这只是原始格式的一部分),所以每次都加入所有这些会有问题。
新列(级别)可以与当前数据一起存储在新生成的 xml 文件中,也可以存储在新文件中,就像将 event_id 映射到级别一样。将所有数据存储在新的 xml 文件中将需要再次生成 xml 文件,但存储不同的文件将需要在每次我需要访问级别时加入它们。两者之间是否存在某种差异(仅以某种格式更新行?)。
能够轻松地为几行添加新节点/列会很棒(比如当存在临界级别时,我想添加额外的注释)。使用 xml 可以轻松完成,但如果有列,则需要为所有行添加新列。
大多数工具只支持平面结构。有像 Hive 和 HQL 这样的工具,但在我的案例中会有太多的连接,所以我更喜欢将数据保存在单个结构化记录中。是否已经有一些解决方案可以解决这个问题?
最佳答案
查看使用 Avro ( http://avro.apache.org ) 或 Google Protobuf 的 https://code.google.com/p/protobuf/作为存储数据的格式,而不是 XML,用于格式,并使用 Avro Serde 解释 Hive 表中的记录。
Avro 支持版本控制,因此您可以拥有包含不同列集的不同记录,具体取决于基础版本和表定义中使用的架构版本。 Avro 还应支持您对任意嵌套和复杂结构的要求。
关于xml - Hadoop 和结构化数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24165676/