我从kafka主题获取json数据。 我如何应用json解析来获取storm方案类中所有使用反序列化方法的对象的所有字段,之后我将值返回到新的返回值()。(backtype.storm.tuple.Values类方法),即,如果我在我的主题中有2个json对象,我循环它们以获取所有字段,最后我必须将所有值返回到return方法。我的返回应该包含两个json对象的所有字段。 / p>
我的问题: 返回方法中只返回2个obj json数据。 我认为第二个对象的所有字段都覆盖了第一个对象字段。最后,最后返回第二个对象字段。
你们中的任何一个人都可以给我一个想法来返回所有对象字段(1,2个对象字段)....
先谢谢
public class MainParserSpout implements Scheme{
String tweet_created_at;
String tweet_id;
String tweet_id_str;
String tweet_text;
String tweet_source;`
@Override
try{
public List<Object> deserialize(byte[] bytes){
String twitterEvent = new String(bytes, "UTF-8");
JSONArray JSON = new JSONArray(twitterEvent);
for(int i=0;i<JSON.length();i++) {
JSONObject object_tweet=JSON.getJSONObject(i);
//Tweet status
try{
this.tweet_created_at=object_tweet.getString("created_at");
this.tweet_id=object_tweet.getString("id");
this.tweet_id_str=object_tweet.getString("id_str");
this.tweet_text=object_tweet.getString("text");
this.tweet_source=object_tweet.getString("source");
}catch(Exception e){}
} //array for close
}catch(Exception e){}
} //JSON array close
return new Values(tweet_created_at,tweet_id,tweet_id_str,tweet_text,tweet_source);
} //deserialize method close
public Fields getOutputFields() {
return newFields("tweet_created_at","tweet_id","tweet_id_str","tweet_text","tweet_source");
} //getOutputFields method close
} //class close
答案 0 :(得分:1)
在deserialize
的一次通话中,您无法获得多个元组。但是,你可以通过“加倍”你的元组发出两条推文,即每个值/字段/属性两次。之后,你可以使用一个带有“双推文”的螺栓,拆分这个元组并发出两个单推文元组。
类似的东西(我不熟悉JSON Tweet格式,因此关于代码示例的问题,这是一个更多的猜测):
@Override
public List<Object> deserialize(byte[] bytes){
List<String> doubleTweet = new ArrayList<String>();
try{
String twitterEvent = new String(bytes, "UTF-8");
JSONArray JSON = new JSONArray(twitterEvent);
for(int i=0;i<JSON.length();i++) {
JSONObject object_tweet=JSON.getJSONObject(i);
for(int j=0;j<object_tweet.length();j++){
//Tweet status
try{
doubleTweet.add(object_tweet.getString("created_at"));
doubleTweet.add(object_tweet.getString("id"));
doubleTweet.add(object_tweet.getString("id_str"));
doubleTweet.add(object_tweet.getString("text"));
doubleTweet.add(object_tweet.getString("source"));
}catch(Exception e){}
}
}
}catch(Exception e){}
return doubleTweet;
}
doubleTweet
包含每个字段两次(第一条推文的字段为0-4,第二条推文的字段为5-9)。因此,连续的螺栓只能提取那些字段,为每个推文发出一个5字段元组。)
作为替代方案,您还可以使用RawScheme
并在后续螺栓中执行JSON解析。在这个螺栓中,你可以发出多个元组(即每个推文一个):https://github.com/apache/storm/tree/master/external/storm-kafka#multischeme
如果您使用RawScheme
,则会有一个带有单个byte[]
字段的元组。因此,您可以在Bolt.execute()
中执行JSON编译,并为每个推文调用Collector.emit()
。
答案 1 :(得分:1)
我错过了kafka是消息发布 - 订阅消息传递系统的观点。 当我试图将数据发送到生产者时我发送了一个Json夹头20个对象作为单个消息,但我的方案仅适用于单个Json夹头。所以我将单个20个对象Json夹在20个json夹头中并分发每个人都去Json的制作人。