pom.xml
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka_2.12</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-streams</artifactId>
<version>3.0.0</version>
</dependency>
示例:
package org.example.kafka;
import org.apache.kafka.common.serialization.Serdes;
import org.apache.kafka.streams.*;
import org.apache.kafka.streams.kstream.KStream;
import java.util.ArrayList;
import java.util.Properties;
import java.util.concurrent.CountDownLatch;
/*
* kafka stream
数据:
id, yes, maybe, invited, no
1, A B C, D F G, U I O, P T
==>
id, people, status
1, A, yes
1, B, yes
1, D, maybe
* */
public class EventAttendeesRawToEventAttendees {
public static void main(String[] args) {
Properties prop = new Properties();
prop.put(StreamsConfig.APPLICATION_ID_CONFIG, "earToeakafka");
prop.put(StreamsConfig.BOOTSTRAP_SERVERS_CONFIG, "study:9092");
prop.put(StreamsConfig.DEFAULT_KEY_SERDE_CLASS_CONFIG, Serdes.String().getClass());
prop.put(StreamsConfig.DEFAULT_VALUE_SERDE_CLASS_CONFIG, Serdes.String().getClass());
StreamsBuilder builder = new StreamsBuilder();
KStream<Object, Object> ear = builder.stream("event_attendees_raw");
ear.flatMap((key, value) -> {
ArrayList<KeyValue<String, String>> list = new ArrayList<>();
String[] fields = value.toString().split(",");
for (int i = 2; i <= 5; i++) {
if (fields.length >= i && fields[i - 1].trim().length() > 0) {
String[] users = fields[i - 1].split("\\s+");
String status = "yes";
if (i == 3) status = "maybe";
else if (i == 4) status = "invited";
else if (i == 5) status = "no";
for (String user : users) {
KeyValue<String, String> keyValue = new KeyValue<>(null, fields[0] + "," + user + "," + status);
list.add(keyValue);
}
}
}
return list;
}).to("event_attendees2");
Topology topology = builder.build();
KafkaStreams streams = new KafkaStreams(topology, prop);
final CountDownLatch latch = new CountDownLatch(1);
Runtime.getRuntime().addShutdownHook(new Thread("stream"){
@Override
public void run() {
streams.close();
latch.countDown();
}
});
try {
streams.start();
latch.await();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}