У меня есть одна проблема, которую я действительно не знаю, что делать. У меня есть файл последовательности 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? Благодаря!
Привет, я содержать ДЖЕКСОНА-core.jar. Это приложение, я делаю файл jar и запускаю его на Hadoop. Означает ли это, что я не включил jackson-core.jar при создании файла jar? Как мне с этим бороться? Благодаря! – user2970089
Да, вы не включили его. Какой инструмент сборки вы используете? (как вы создаете эту банку?) Существуют различные способы ее включения в зависимости от вашего инструмента построения. Я дал вам решение в своем ответе для maven. – FazoM
Привет, я загружаю банку Jackson и включен в проект. Я не использовал maven. Итак, с точки зрения этого, как включить внешнюю банку, чтобы сделать это? Благодаря! – user2970089