我有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处理它。让我们说,对于每个事件,我想添加一个额外的节点:&lt; level&gt; ......&lt; / level&gt;基于&lt; warning&gt;节点。所以现在有很多问题需要解决:
如何在Hadoop中存储结构化数据?我可以将它保存在xml中,但我没有看到任何具有本机xml / json支持的工具(猪支持json,但没有列表)。我可以按列拆分到不同的文件(一个用于事件,一个用于警告,然后按事件ID加入),但是有很多子节点(这只是原始格式的一部分),所以每次都加入所有这些子节点会有问题。
新列(级别)可以存储在具有当前数据的新生成的xml文件中,也可以存储在新文件中,就像将event_id映射到级别一样。将所有数据存储在新的xml文件中将需要再次生成xml文件,但是存储它不同的文件将需要在每次我需要访问级别时加入它们。是否有某些东西(只是以某种格式更新行?)。
能够轻松地为几行添加新节点/列会非常棒(例如,当存在关键级别时,我想添加额外的注释)。可以使用xml轻松完成,但如果有列,则需要为所有行添加新列。
大多数工具仅支持扁平结构。有像Hive和HQL这样的工具,但在我的案例中会有太多的连接,所以我更喜欢将数据保存在单个结构化记录中。是否有解决此问题的解决方案?
答案 0 :(得分:1)
使用Avro(http://avro.apache.org)或Google Protobuf https://code.google.com/p/protobuf/作为格式存储数据而不是XML的格式,并使用Avro Serde解释记录在Hive表中。
Avro支持版本控制,因此您可以使用不同的列集创建不同的记录,具体取决于基础版本以及表定义中使用的架构版本。 Avro还应该支持您对任意嵌套和复杂结构的要求。
答案 1 :(得分:0)