需求背景:
1.所有用户行为存放在kafka 中。
2.用户数据存储在Mysql中,当新用户到来时,Mysql会新增一条记录。
要求:只统计新用户的实时行为数据,并写入下游kafka。
实现方案:
参考官方文档:
在此示例中,第一个流将包含Item
带有Color
和Shape
属性的type元素。另一个流将包含Rules
。
可以看到官方给的例子中,item流类似我们的用户行为,rules流类似于我们的mysql用户表。我们将他们分别称为数据流和广播流。
在这里,我们利用Canal将mysql的binlog数据转换为kafka的流数据。这样,我们就得到了广播流。
SingleOutputStreamOperator<Tuple6<String,String,String,String,String,Long>> mysqlSource = env.addSource(mysqlConsumer).setParallelism(1)
.name("mysql").uid("mysql").flatMap(new FlatMapFunction<JsonNode, Tuple6<String,String,String,String,String,Long>>() {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
@Override
public void flatMap(JsonNode value, Collector<Tuple6<String,String,String,String,String,Long>> out) throws Exception {
JsonNode v = value.get("value");
if("INSERT".equals(v.get("type").asText())){
//只处理Type是INSERT的情况
Tuple6<String,String,String,String,String,Long> res = new Tuple6<String,String,String,String,String,Long>();
res.f0=v.get("data").get(0).get("uid").asText();
res.f1=v.get("table").asText();
res.f2=v.get("data").get(0).get("name").asText();
res.f3=v.get("data").get(0).get("time").asText().substring(0,13)+":00:00";
res.f4=v.get("data").get(0).get("c_id").asText();
res.f5=simpleDateFormat.parse(v.g