Since you are declaring that you emit two values you need to emit two values 
any time you call emit.  If you want to emit two totally different things at 
different times (ids and nms) you should set up the bolt to emit on two 
different channels.  You should also only "ack" your tuple once, at the end of 
all your processing.

From: Sai Dilip Reddy Kiralam 
<dkira...@aadhya-analytics.com<mailto:dkira...@aadhya-analytics.com>>
Reply-To: "user@storm.apache.org<mailto:user@storm.apache.org>" 
<user@storm.apache.org<mailto:user@storm.apache.org>>
Date: Tuesday, March 1, 2016 at 6:16 AM
To: "user@storm.apache.org<mailto:user@storm.apache.org>" 
<user@storm.apache.org<mailto:user@storm.apache.org>>
Subject: How to emit the values in a for-each loop

I'm having the a string values which are appended so i used the for each loop 
and sliptted them and emit them with in the for each loop.if I'm getting id 
string v="1,2,3";
I'm using for each and emitting the id in for loop itself.
next when I Tried to emit the value of other string which is a appended one and 
declaring it as field.I getting the error saying


java.lang.IllegalArgumentException: Tuple created with wrong number of fields. 
Expected 2 fields but got 1 fields at 
backtype.storm.tuple.TupleImpl.<init>(TupleImpl.java:58) at 
backtype.storm.daemon.executor$fn__5694$fn__5707$bolt_emit__5736.invoke(executor.clj:739)
 at 
backtype.storm.daemon.executor$fn__5694$fn$reify__5742.emit(executor.clj:763) 
at backtype.storm.task.OutputCollector.emit(OutputCollector.java:203) at 
backtype.storm.task.OutputCollector.emit(OutputCollector.java:63) at 
backtype.storm.task.OutputCollector.emit(OutputCollector.java:101) at 
test.bolts.TInserts.execute(TInsert.java:264)


Here is my bolt code.


 public void execute(Tuple tuple) {
   try {String screenname=tuple.getStringByField("s_name");
    String mentionname=tuple.getStringByField("n_name");
    String mentionid=tuple.getStringByField("n_id");

                 if(mentionid != null && !mentionid.isEmpty()){
                     for(String id:mentionid.split(",")){
                        id = id.trim();
                          this.collector.emit(new Values(id));
 this.collector.ack(tuple);
 }//for close
 }//if condtion for id
 if(mentionname != null && !mentionname.isEmpty()){
                     for(String mns:mentionname.split(",")){
                        mns = mns.trim();
                          this.collector.emit(new 
Values(mns));this.collector.ack(tuple);
   }//for close
 }//if condtion for mentionname

  } //if close
    }
             catch (Exception e) {
           this.collector.reportError(e);
          this.collector.fail(tuple);
             }
       }


@Override
   public void declareOutputFields(OutputFieldsDeclarer outputFieldsDeclarer) 
{//   outputFieldsDeclarer.declare(new Fields("id"));//doesn't throw any   
exception if i emit only id(1st for)
    outputFieldsDeclarer.declare(new Fields("id","mns"));//thows exception }}

please give the suggestion that I need to change in the bolt code.

Reply via email to