其中用到了滑动窗口函数大小30秒,间隔15秒,且大于窗口10秒的数据,被丢弃。(实际业务这三个值 应为是 10 分钟,1分钟,5分钟)。代码先记录一下
public static void main(String[] arg) throws Exception {
final StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.getConfig().enableSysoutLogging();//开启Sysout打日志
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime); //设置窗口的时间单位为process time
Properties props = new Properties();
props.put("bootstrap.servers", "kafkaip:9092");
props.put("group.id", "metric-group4");
props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer"); //key 反序列化
props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
props.put("auto.offset.reset", "earliest"); //value 反序列化
DataStreamSource<String> dataStreamSource = env.addSource(new FlinkKafkaConsumer011<>(
"im-message-topic3", //kafka topic
new SimpleStringSchema(), // String 序列化
props)).setParallelism(1);
DataStream<Message> bean3DataStream = dataStreamSource.map(new MapFunction<String, Message>() {
@Override
public Message map(String value) throws Exception {
logger.info("receive msg:"+value);
JSONObject jsonObject =JSONObject.parseObject(value);
Message s= new Message(
jsonObject.getString("sessionId"),
jsonObject.getString("fromUid"),
jsonObject.getString("toUid"),
jsonObject.getString("chatType"),
jsonObject.getString("type"),
jsonObject.getString("msgId"),
jsonObject.getString("msg"),
jsonObject.getLong("timestampSend")
);
return s;
}
});
//设置水印,并过滤数据
DataStream<Message> bean3DataStreamWithAssignTime =
bean3DataStream.assignTimestampsAndWatermarks(new TruckTimestamp()).timeWindowAll(Time.seconds(30),Time.seconds(15)).apply(new AllWindowFunction<Message, Message,TimeWindow>() {
@Override
public void apply(TimeWindow window, Iterable<Message> values, Collector<Message> out)
throws Exception {
for (Message t: values) {
logger.info("window start time:"+new Date(window.getStart()).toString());
logger.info("real time:"+new Date(t.getTimestampSend()).toString());
if(t.getTimestampSend()<window.getStart()+1000*10) {
logger.info("yes");
out.collect(t);
}else {
logger.info("no");
}
}
}
});
//bean3DataStreamWithAssignTime.addSink(new Sink());
//bean3DataStreamWithAssignTime.writeAsText("/usr/local/whk3", WriteMode.OVERWRITE);
StreamTableEnvironment tableEnv = TableEnvironment.getTableEnvironment(env);
tableEnv.registerDataStream("myTable", bean3DataStreamWithAssignTime, "sessionId, fromUid,toUid,chatType,type,msgId,msg,timestampSend,rowtime.rowtime");
Table temp=tableEnv.scan("myTable");
System.out.println("schema is:");
temp.printSchema();
// Table tb3 = tableEnv.sqlQuery("select * from myTable");
// DataStream<Row> appendStream =tableEnv.toAppendStream(tb3, Row.class);
// appendStream.addSink(new Sink());
//对过滤后的数据,使用正则匹配数据
Table tb2 = tableEnv.sqlQuery(
"SELECT " +
" * " +
"FROM myTable" +
" " +
"MATCH_RECOGNIZE ( " +
"PARTITION BY sessionId " +
"ORDER BY rowtime " +
"MEASURES " +
"e2.timestampSend as answerTime, "+
"LAST(e1.timestampSend) as customer_event_time, " +
"e2.fromUid as empUid, " +
"e1.timestampSend as askTime," +
"1 as total_talk " +
"ONE ROW PER MATCH " +
"AFTER MATCH SKIP TO LAST e2 " +
"PATTERN (e1+ e2+?) " +
"DEFINE " +
"e1 as e1.type = 'yonghu', " +
"e2 as e2.type = 'guanjia' " +
")"+
""
);
DataStream<Row> appendStream2 =tableEnv.toAppendStream(tb2, Row.class);
appendStream2.addSink(new Sink2());
env.execute("msg v5");
}
public static class TruckTimestamp extends AscendingTimestampExtractor<Message> {
private static final long serialVersionUID = 1L;
@Override
public long extractAscendingTimestamp(Message element) {
return element.getTimestampSend();
}
}
public static class Sink implements SinkFunction<Row> {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void invoke(Row value) throws Exception {
System.out.println(new Date().toString()+"orinal time:"+value.toString());
}
}
public static class Sink2 implements SinkFunction<Row> {
/**
*
*/
private static final long serialVersionUID = 1L;
@Override
public void invoke(Row value) throws Exception {
System.out.println(new Date().toString()+"new time:"+value.toString());
}
}