2013-02-06 4 views
0

Я делаю приложение для обработки некоторых данных, хранящихся в mongoDB, с использованием Hadoop. Я пишу программу в java.получить значение массива внутри поддокумента mongodb

Дело в том, что у меня есть поддокумент, содержащий массив, и я хочу принять значение одного атрибута массива. Я приведу пример, чтобы увидеть его более ясно.

"entities" : { 
      "hashtags" : [ 
        { 
          "**text**" : "whatever", 
          "indices" : [ 
            59, 
            69 
          ] 
        }, 
        { 
          "**text**" : "whatever", 
          "indices" : [ 
            82, 
            95 
          ] 
        } 
      ], 
      "urls" : [ ], 
      "user_mentions" : [ ] 
    }, 

Значение текста - это тот, который я хочу обработать.

Так что я разработал программу на Java, и она сообщает мне следующее сообщение об ошибке в классе картографа:

java.lang.ClassCastException: com.mongodb.BasicDBObject cannot be cast to java.lang.String 
    at HashTagsMapper.map(HashTagsMapper.java:27) 
    at HashTagsMapper.map(HashTagsMapper.java:18) 
    at org.apache.hadoop.mapreduce.Mapper.run(Mapper.java:144) 
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:764) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:370) 
    at org.apache.hadoop.mapred.Child$4.run(Child.java:255) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:415) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1121) 
    at org.apache.hadoop.mapred.Child.main(Child.java:249) 

Это класс картографа ->

public class HashTagsMapper extends Mapper<Object, BSONObject, Text, IntWritable> 
{ 
    public void map(Object key, BSONObject value, Context context) throws IOException, InterruptedException 
    { 

     ArrayList <String> name = new ArrayList<String>(); 
     BSONObject entities = (BSONObject) value.get("entities"); 
     BasicDBList hashtags = (BasicDBList) entities.get("hashtags"); 
     for(int index = 0; index < hashtags.size(); index++){ 
      name.add((String) hashtags.get(index)); 
     } 
     try{ 
      FileWriter fw = new FileWriter("/home/jonrodriguez/Hashtags.txt"); 
      PrintWriter escribirListaRedundantes = new PrintWriter(fw); 

      escribirListaRedundantes.println(name); 

      fw.close(); 

     } 

      catch(java.io.IOException ioex){} 
     for(int i = 0; i < name.size(); i++){ 
      context.write(new Text(name.get(i)), new IntWritable(1)); 
     } 
    } 

Может кто-нибудь мне помочь ? Благодаря!

+0

Проблема заключается именно в том, что говорит исключение * - объект, возвращенный из 'hashtags.get (index)', не является 'String', это [' BasicDBObject'] (http://api.mongodb.org) /java/2.0/com/mongodb/BasicDBObject.html). Это соответствует тому, что вы показываете в своем документе - 'hashtags' - это массив объектов, который, в свою очередь, содержит ключи' text' и 'indices'. –

+0

Голосование закрывается, потому что это простое недоразумение со стороны искателя и вряд ли будет полезно будущим читателям. –

ответ

0

Проблема заключается в исключении класса. Почему бы вам не попробовать писать не

(String)hashtags.get(index) 

, но

hashtags.get(index).toString() 

Проблема может быть, что basicDbList является Список BDBObjects и вы не можете бросить родителей к ребенку.

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