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

一、需求分析

1.维度信息,关联mysql数据库查询【Flink-需求】RichMapFunction实现活动数据实时计算关联维度信息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【Flink-需求】RichMapFunction实现活动数据实时计算关联维度信息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.运行结果:【Flink-需求】RichMapFunction实现活动数据实时计算关联维度信息


原文始发于微信公众号(Coding路人王):【Flink-需求】RichMapFunction实现活动数据实时计算关联维度信息

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/41746.html

(0)
小半的头像小半

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!