我有一个庞大复杂的xml文件,从中可以生成xsd/数据库表。因为它是一个巨大的文件,所以我在hadoop场景中查看它。我检查了许多处理xml的方法(在hadoop中),例如:
将xml转换为avro格式
使用mahout xmlinputformat
重写map reduce的recordreader类
使用oracle xmlextension将xml直接加载到配置单元表,但是。。我们所有上述方法都需要手动硬编码xml标记/元素。例如,考虑foo.xml
<CustomerReport>
<Customer>
<CustomerName>DKIJzuUG</CustomerName>
<CustomerStatus>active</CustomerStatus>
<age>70</age>
<gender>female</gender>
<AquistionChannel>uBeApXji</AquistionChannel>
<State>MZlNWI</State>
<HouseholdIncome>0506</HouseholdIncome>
<Revenue>54961</Revenue>
<PurchaceOrders>
<PurchaceOrder>
<PurchaceOrderName>qkiHEH</PurchaceOrderName>
<purchasedOn>02-01-2014</purchasedOn>
<amount>899</amount>
</PurchaceOrder>
</PurchaceOrders>
......
</Customer>
</CustomerReport>
在上面列出的所有方法中,硬编码标签“customer report,customer,customer name….”是必要的。但是在我们的例子中,标签不应该手动给出。
由于xml中有嵌套的标记,我们可能需要在db中创建多个表,并且还需要依赖关系。我们不知道如何处理嵌套结构和动态设计数据库。
1条答案
按热度按时间slwdgvem1#
oracle表适配器非常擅长拆分大型xml文件:http://docs.oracle.com/bigdata/bda49/bdcug/oxh_hive.htm#bdcug694
其他类似的解决方案使用字符串匹配或正则表达式来提取拆分的xml元素。这种技术容易出错,可能会导致无意中跳过文档中的数据。oracle的解决方案使用扫描和流解析的组合来识别分割的元素。因此,它速度很快,可以处理更多的用例。
下载位置:http://www.oracle.com/technetwork/database/database-technologies/bdc/big-data-connectors/downloads/index.html
(xquery for hadoop的一部分)