【Flink-需求】RichMapFunction实现活动数据实时计算关联维度信息

18 篇文章 10 订阅

一、需求分析

1.维度信息,关联mysql数据库查询
在这里插入图片描述
2.数据为以下格式:
user001,A1,2020-09-23 10:10:10,2,北京市
user002,A3,2020-09-23 10:10:10,1,上海市
user003,A2,2020-09-23 10:10:10,2,苏州市
user002,A3,2020-09-23 10:10:10,1,辽宁市
user001,A2,2020-09-23 10:10:10,2,北京市
user002,A2,2020-09-23 10:10:10,1,上海市
user003,A1,2020-09-23 10:10:10,1,北京市
经过实时计算Flink处理后变成了如下格式
user001,新人礼物,2020-09-23 10:10:10,2,北京市
user002,年终礼物,2020-09-23 10:10:10,1,上海市
user003,月末礼物,2020-09-23 10:10:10,2,苏州市

二、环境要求

1.zookeeper
2.kafka
在这里插入图片描述
3.创建topic

bin/kafka-topics.sh --create --zookeeper  hadoop1:2181,hadoop2:2181,hadoop3:2181 --replication-factor 3 --partitions 2 --topic activity

三、flink程序

3.1 Activity实体类

public class ActivityBean {
    public String uid;
    public String aid;
    public String activityName;
    public String time;
    public int eventType;
    public String province;

    public ActivityBean() {
    }

    public ActivityBean(String uid, String aid, String activityName, String time, int eventType, String province) {
        this.uid = uid;
        this.aid = aid;
        this.activityName = activityName;
        this.time = time;
        this.eventType = eventType;
        this.province = province;
    }

    @Override
    public String toString() {
        return "ActivityBean{" +
                "uid='" + uid + '\'' +
                ", aid='" + aid + '\'' +
                ", activityName='" + activityName + '\'' +
                ", time='" + time + '\'' +
                ", eventType=" + eventType +
                ", province='" + province + '\'' +
                '}';
    }

    public static ActivityBean of(String uid,String aid,String activityName,String time,int eventType,String province){
        return new ActivityBean(uid,aid,activityName,time,eventType,province);
    }
}

3.2 flink实时计算程序

public class ActivityCount {
        public static void main(String[] args) throws Exception {
            //1.获取环境
            StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();

            //2.kafka配置
            String topic = "activity";
            Properties prop = new Properties();
            prop.setProperty("bootstrap.servers", "192.168.52.200:9092");//多个的话可以指定
            prop.setProperty("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
            prop.setProperty("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
            prop.setProperty("auto.offset.reset", "earliest");
            prop.setProperty("group.id", "consumer1");

            FlinkKafkaConsumer<String> myConsumer = new FlinkKafkaConsumer<String>(topic, new SimpleStringSchema(), prop);
            //3.获取数据
            DataStream<String> lines = env.addSource(myConsumer);

            SingleOutputStreamOperator<ActivityBean> beans = lines.map(new RichMapFunction<String, ActivityBean>() {

                private Connection connection = null;

                // 4.连接数据库
                @Override
                public void open(Configuration parameters) throws Exception {
                    super.open(parameters);
                    connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/flink?characterEncoding=UTF-8","root","123456");
                }

                @Override
                public ActivityBean map(String line) throws Exception {
                    String[] fields = line.split(",");
                    String uid = fields[0];
                    String aid = fields[1];

                    // 5.查询条件为aid 活动标号,查出活动的名称
                    PreparedStatement preparedStatement = connection.prepareStatement("select name from activities where id = ?");
                    preparedStatement.setString(1, aid);
                    ResultSet resultSet = preparedStatement.executeQuery();
                    String name = null;
                    while (resultSet.next()) {
                        name = resultSet.getString(1);
                    }
                    preparedStatement.close();

                    String time = fields[2];
                    int eventType = Integer.parseInt(fields[3]);
                    String province = fields[4];

                    return ActivityBean.of(uid, aid, name, time, eventType, province);
                }

                // 6.关闭数据库连接
                @Override
                public void close() throws Exception {
                    super.close();
                    connection.close();
                }
            });

            beans.print();

            //7.执行
            env.execute("StreamingActivity");

        }
}

四、测试

1.开启kafka生产者

bin/kafka-console-producer.sh --broker-list 192.168.52.200:9092,192.168.52.201:9092,192.168.52.202:9092 --topic activity

2.运行flink程序
3.运行结果:
在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coding路人王

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值