счетчик слов hadoop с разбором xml - PullRequest
0 голосов
/ 28 августа 2018

Здравствуйте, я новичок в мире hadoop. Я научился делать WordCount. чтобы сделать это на ступеньку выше, я узнаю, как обрабатывать XML-данные. и картограф, который я использую, это

public static class Map extends Mapper<LongWritable, Text,
Text, IntWritable> {
    private final static IntWritable one = new IntWritable(1);
    @Override
    protected void map(LongWritable key, Text value,
            Mapper.Context context)
    throws
    IOException, InterruptedException {
        String document = value.toString();
        System.out.println("‘" + document + "‘");
        try {
            XMLStreamReader reader =
                XMLInputFactory.newInstance().createXMLStreamReader(new
                        ByteArrayInputStream(document.getBytes()));
            String propertyKey = "";
            String currentElement = "";
            while (reader.hasNext()) {
                int code = reader.next();
                switch (code) {
                case XMLStreamConstants.START_ELEMENT: //START_ELEMENT:
                    currentElement = reader.getLocalName();
                    break;
                case XMLStreamConstants.CHARACTERS: //CHARACTERS:
                    if (currentElement.equalsIgnoreCase("value")) {
                        propertyKey += reader.getText();
                        System.out.println("value"+propertyKey);
                    } else if (currentElement.equalsIgnoreCase("name")) {
                        propertyKey += reader.getText();
                        System.out.println("name"+propertyKey);
                    }
                    break;
                }           
            }
            reader.close();
        context.write(new Text(propertyKey.trim()), one);
        }
        catch(Exception e){
            throw new IOException(e);

        }

    }
}

Мой ввод - это xml-файл:

<configuration>
<property>
<name>dfs.replication</name>
<value>1</value>
</property>

<property>
<name>dfs.namenode.name.dir</name>
<value>file:/usr/local/hadoop_tmp/hdfs/namenode</value>
</property>

</configuration>

проблема с этим картографом в том, что я не получил значение для некоторых ключей. вывод, который я получаю, это

dfs.namenode.name.dir

файл: / usr / local / hadoop_tmp / hdfs / namenode 1

dfs.replication

1 1

вывод отображаемого файла, который я хочу,

dfs.namenode.name.dir 1

файл: / usr / local / hadoop_tmp / hdfs / namenode 1

dfs.replication 1

1 1

У кого-нибудь есть предложения, как это решить? заранее спасибо.

...