我正在从kafka中读取来自2个不同主题的2个不同文件的行。线条示例:
例如:
File1:2015-04-15T18:44:14+01:00,192.168.11.42,%ASA-2-106007:
File2:"04/15/2012","18:44:14",,"Start","Unknown","Unknown",,"192.168.63.128","444","2","7","192.168.63.128",,,,,,,,,,,,,,,,,
我可以从两个不同主题的spark中读取。代码如下:
SparkConf sparkConfig = new SparkConf().setAppName("KafkaStreaming").setMaster("local[5]");
JavaStreamingContext jsc = new JavaStreamingContext(sparkConfig,Durations.seconds(5));
final HiveContext sqlContext = new HiveContext(jsc.sc());
JavaPairReceiverInputDStream<String, String> messages = KafkaUtils.createStream(jsc,
prop.getProperty("zookeeper.connect"),
prop.getProperty("group.id"),
topicMap
);
JavaDStream<String> lines = messages.map(new Function<Tuple2<String, String>, String>() {
private static final long serialVersionUID = 1L;
public String call(Tuple2<String, String> tuple2) {
return tuple2._2();
}
});
我现在看到的问题是:
行 rdd包含明显的行。如何隔离或找出哪个记录来自哪个主题或哪个文件。
这背后的原因是我想为不同的主题应用不同的逻辑,这是火花。但是rdd在时间上有所有行
感谢任何建议
答案 0 :(得分:1)
您必须选择createDirectStream
重载方法,该方法接受scala.Function1<kafka.message.MessageAndMetadata<K,V>,R> messageHandler
作为参数。比,你只需要传递一个函数messageHandler
- 获取一个MessageAndMetadata
对象作为输入 - 返回实际的消息和主题。
在这里,我向您发送用Scala编写的代码。您可以轻松地在Java中进行调整:
KafkaUtils.createDirectStream[String, String, StringDecoder, StringDecoder, (String,String)](ssc,
kafkaParams,
topicOffsetsMap,
(m:MessageAndMetadata[String, String])=> (m.topic,m.message())
)