2014-09-19 3 views
0

У меня есть одна проблема, которую я действительно не знаю, что делать. У меня есть файл последовательности Hadoop, содержащий ссылки на веб-страницу. Каждая запись файла последовательности Hadoop, ключ будет URL-адресом одной веб-страницы, а значением будут его атрибуты и ссылки. Фактически это формат Json. Я хочу прочитать весь файл последовательности и передать значение парсера джексону, чтобы получить ссылки, однако он всегда терпел неудачу. Вот мой код:Как изменить значение файла последовательности hadoop для парсера джексона?

Configuration conf = new Configuration(); 
    Path seqFilePath = new Path("metadata-00000"); 

    SequenceFile.Reader reader = new SequenceFile.Reader(conf, 
      Reader.file(seqFilePath)); 
    Writable key = (Writable)ReflectionUtils.newInstance(reader.getKeyClass(), conf); 
    Writable value = (Writable)ReflectionUtils.newInstance(reader.getValueClass(), conf); 

    int count = 0; 
    while(reader.next(key, value)) { 

     System.out.println(value.toString()); 
     JsonParser jsonParser = new JsonFactory().createJsonParser(value.toString()); 
     while(jsonParser.nextToken() != JsonToken.END_OBJECT) { 
      String name = jsonParser.getCurrentName(); 
      if(name.equals("server_ip")) { 
       System.out.println(jsonParser.getValueAsString()); 
      } 

      if(name.equals("links")) { 
       while(jsonParser.nextToken() != JsonToken.END_ARRAY) { 
        String attribute = jsonParser.getCurrentName(); 

        if(attribute.equals("href")) { 
         System.out.println(jsonParser.getValueAsString()); 
        }     
       } 
      } 
     } 

     long position = reader.getPosition(); 
     System.out.println(position); 
     count++; 

     if(count == 5) { 
      break; 
     } 
    } 

Файл «метаданные-00000» оригинальный файл последовательности Hadoop. Как вы можете видеть, значение действительно в формате json, и я хочу проанализировать его в парсере Джексона. Однако эта линия всегда проваливались:

JsonParser jsonParser = new JsonFactory().createJsonParser(value.toString()); 

исключение составляет:

Exception in thread "main" java.lang.NoClassDefFoundError: com/fasterxml/jackson/core/JsonFactory 
    at WebParser.ParserTest.main(ParserTest.java:35) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.apache.hadoop.util.RunJar.main(RunJar.java:212) 
Caused by: java.lang.ClassNotFoundException: com.fasterxml.jackson.core.JsonFactory 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366) 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:358) 
    ... 6 more 

Так как я должен с этим бороться? Как передать значение Writable в json parser? Благодаря!

ответ

0

Ваше приложение не может подать класс: com/fasterxml/jackson/core/JsonFactory

Проверьте, если есть ДЖЕКСОН-жильная банка в вашем классе пути.

Или попробуйте добавить это в файл pom.xml (если вы используете Maven как инструмент для сборки):

<dependency> 
    <groupId>com.fasterxml.jackson.core</groupId> 
    <artifactId>jackson-core</artifactId> 
    <version>2.4.2</version> 
</dependency> 
+0

Привет, я содержать ДЖЕКСОНА-core.jar. Это приложение, я делаю файл jar и запускаю его на Hadoop. Означает ли это, что я не включил jackson-core.jar при создании файла jar? Как мне с этим бороться? Благодаря! – user2970089

+0

Да, вы не включили его. Какой инструмент сборки вы используете? (как вы создаете эту банку?) Существуют различные способы ее включения в зависимости от вашего инструмента построения. Я дал вам решение в своем ответе для maven. – FazoM

+0

Привет, я загружаю банку Jackson и включен в проект. Я не использовал maven. Итак, с точки зрения этого, как включить внешнюю банку, чтобы сделать это? Благодаря! – user2970089

 Смежные вопросы

  • Нет связанных вопросов^_^