2014-09-19 66 views
0

我有一個問題,我真的不知道該怎麼做。我有一個包含網頁鏈接的Hadoop序列文件。 Hadoop序列文件的每個條目,關鍵字將是一個網頁的URL,值將是它的屬性和鏈接。該值實際上是Json格式。我想讀取所有序列文件並將值傳遞給jackson解析器以獲取鏈接,但它總是失敗。這裏是我的代碼:如何將hadoop序列文件值更改爲jackson解析器?

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; 
     } 
    } 

文件「metadata-00000」是原始的Hadoop序列文件。如你所見,這個值實際上是json格式,我想在Jackson解析器中分析它。然而,這條線總是失敗:

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解析器?謝謝!

回答

0

您的應用程序無法歸檔類:com/fasterxml/jackson/core/JsonFactory

驗證是否有傑克遜核心的jar在類路徑中。

或嘗試添加以下內容到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上運行它。這是否意味着我在製作jar文件時沒有包含jackson-core.jar?我應該如何處理它?謝謝! – user2970089 2014-09-19 16:03:36

+0

是的,你沒有包括它。你正在使用什麼構建工具? (你如何創建該jar?)根據你的構建工具,有不同的方式來包含它。我已經給你解決方案在我的答案爲maven。 – FazoM 2014-09-19 16:26:21

+0

嗨,我下載傑克遜jar包含在項目中。我沒有使用maven。所以就此而言,我應該如何包含外部的jar來創建它?謝謝! – user2970089 2014-09-19 17:00:29