dataStream sink

示例:
socket发送数据,把String转java对象,然后保存到mysql数据库中
Student.class
public class Student {
    private int id;
    private String name;
    private int age;
    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
main方法:
public static void main(String[] args) throws Exception {
    StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
    DataStreamSource<String> source =  env.socketTextStream("192.168.1.176", 9999);
    SingleOutputStreamOperator<Student> studentStream =  source.map(new MapFunction<String, Student>() {
        public Student map(String value) throws Exception {
            String[] splits = value.split(",");
            Student stu = new Student();
            stu.setId(Integer.parseInt(splits[0]));
            stu.setName(splits[1]);
            stu.setAge(Integer.parseInt(splits[2]));
            return stu;
        }
    });
    studentStream.addSink(new SinkToMySQL());
    env.execute("JavaCustomSinkToMySQL");
}
SinkToMysql:
package com.imooc.flink.java.course05;
import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.functions.sink.RichSinkFunction;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
/**
* Author: Michael PK
* 自定义MySQL Sink
*/
public class SinkToMySQL extends RichSinkFunction<Student>{
    Connection connection;
    PreparedStatement pstmt;
    private Connection getConnection() {
        Connection conn = null;
        try {
            Class.forName("com.mysql.jdbc.Driver");
            String url = "jdbc:mysql://localhost:3306/test";
            conn = DriverManager.getConnection(url,"root","root");
        } catch (Exception e) {
            e.printStackTrace();
        }
        return conn;
    }
    /**
     * 在open方法中建立connection
     * @param parameters
     * @throws Exception
     */
    @Override
    public void open(Configuration parameters) throws Exception {
        super.open(parameters);
        connection = getConnection();
        String sql = "insert into student(id,name,age) values (?,?,?)";
        pstmt = connection.prepareStatement(sql);
        System.out.println("open");
    }
    // 每条记录插入时调用一次
    public void invoke(Student value, Context context) throws Exception {
        System.out.println("invoke~~~~~~~~~");
        // 为前面的占位符赋值
        pstmt.setInt(1, value.getId());
        pstmt.setString(2, value.getName());
        pstmt.setInt(3, value.getAge());
        pstmt.executeUpdate();
    }
    /**
     * 在close方法中要释放资源
     * @throws Exception
     */
    @Override
    public void close() throws Exception {
        super.close();
        if(pstmt != null) {
            pstmt.close();
        }
        if(connection != null) {
            connection.close();
        }
    }
}
    
小结:
1:RichSinkFunction<T>   T就是你想要写入对象的类型
2:重写方法
    open/close:生命周期方法
    invoke:每条记录执行一次
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值