gpt4 book ai didi

java - 在MapReduce中解析XML文件

转载 作者:行者123 更新时间:2023-12-02 21:22:51 25 4
gpt4 key购买 nike

我有一个XML文件列表,需要使用MR代码进行解析。

xml文件的示例如下

<tns:envelope xmlns:tns="http://abcd.com/schemas/envelope/v3_0" xmlns:xsi="http://www.abcd.org/2001/XMLSchema-instance" version="3.0">
<tns:header>
<tns:type>response</tns:type>
<tns:service>
<tns:name>Value1</tns:name>
<tns:version>3.0</tns:version>
</tns:service>
<tns:originator>Value2</tns:originator>
<tns:businessProcessName>Value3</tns:businessProcessName>
<tns:sequenceNumber>value3</tns:sequenceNumber>
<tns:transactionReference>abcdef12345</tns:transactionReference>
<tns:expirationSeconds>1200</tns:expirationSeconds>
<tns:additionalParameters>
<tns:param>
<tns:name>notificationURL</tns:name>
<tns:value>https://url1</tns:value>
</tns:param>
<tns:param>
<tns:name>ConsumingCallbackURL</tns:name>
<tns:value>https://url2</tns:value>
</tns:param>
</tns:additionalParameters>
<tns:result>
<tns:status>success</tns:status>
<tns:provider>ABC</tns:provider>
</tns:result>
<tns:requestDateTime>2016-02-16T08:12:17.827Z</tns:requestDateTime>
</tns:header>
<tns:body></tns:body>
</tns:envelope>

现在,我有了一个配置文件,其中保留了需要解析的感兴趣标签。示例标签名称如下所示
/envelope/version
/envelope/header/type
/envelope/header/service/name
/envelope/header/additionalParameters/param/name
/envelope/header/additionalParameters/param/value

预期的输出将如下所示
/envelope/version /envelope/header/type /envelope/header/service/name /envelope/header/additionalParameters/param/name /envelope/header/additionalParameters/param/value
3.0 response Value1 notificationURL https://url1
3.0 response Value1 ConsumingCallbackURL https://url2

我可以获取示例代码来解析XML并获取所需的示例输出。

最佳答案

在半结构化数据(例如XML)的情况下,存储数据的格式非常重要。查看样本XML数据,我只能假定它是某种Web服务日志。我可以举两个在Hadoop中使用XML文件的场景的例子。

  • 如果您可以控制xml文件的存储方式,则可以采用以下格式(每个节点由换行符分隔)。您可以使用默认的hadoop TextInputFormat读取每一行。
    <tns:envelope .... </tns:envelope><tns:envelope .... </tns:envelope><tns:envelope .... </tns:envelope>

  • 示例代码:
    public static class XMLDataMap extends Mapper<LongWritable, Text, Text, Text> {

    @Override
    protected void map(LongWritable key,
    Text value, Mapper.Context context) throws Exception {
    //read each line of XML data
    String xmlDataLine = value.toString();
    String tagName = "";
    String tagValue = "";

    //implement XML parsing logic below
    //I recommend using StAX parser, you can use DOM as well or already implemented parsing logic here

    //tagName = parse logic
    //tagValue = parse logic

    context.write(tagName, tagValue);

    }

    注意:如果您无法控制数据的存储方式并且漂亮地打印了XML数据(与提供的示例相同的格式),则可以删除换行符并使它看起来像上面的格式。这样,您可以确保xml数据有效(不丢失标签),并使用可用的库来解析xml。
  • 如果将XML层叠为以下格式,则它将变得更加有趣。您必须实现一个自定义InputFormat,以将级联XML拆分为多个<tns:envelope .... </tns:envelope>。不用担心,我们有一个XmlInputFormat可以使用这种XML格式。最初是为Apache Mahout项目创建的,但今天有多个版本。
  • <cascadedXML> <tns:envelope .... </tns:envelope> <tns:envelope .... </tns:envelope> <tns:envelope .... </tns:envelope> ..... </cascadedXML>

    <cascadedXML><tns:envelope .... </tns:envelope><tns:envelope ....</tns:envelope><tns:envelope .... </tns:envelope> ..........</cascadedXML>
    注意:,我建议查看stackoverflow链接( Not executing my hadoop mapper class while parsing xml in hadoop using XMLInputFormat),几个月前我已经回答了类似的问题。

    另外,请参阅Alex Holmes的《 Hadoop in Practice》一书和该书中的示例代码( Hadoop In Practice Github),以获取更多见解。

    关于java - 在MapReduce中解析XML文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36845548/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com