自定义sink
public class SinkToJDBC {
public static void main(String[] args) throws Exception {
StreamExecutionEnvironment env =StreamExecutionEnvironment.getExecutionEnvironment();
DataStreamSource<String> inputStream =
env.readTextFile("D:\\Tool\\Idea2020\\FlinkTest\\src\\main\\resources\\file.txt");
//转换类型
SingleOutputStreamOperator<SensorReading> dataStream = inputStream.map(new MapFunction<String, SensorReading>() {
@Override
public SensorReading map(String s) throws Exception {
String[] splits = s.split(",");
return new SensorReading(splits[0],new Long(splits[1]),new Double(splits[2]));
}
});
dataStream.addSink(new MyJDBCSink());
env.execute();
}
//自定义sinkfunction
public static class MyJDBCSink extends RichSinkFunction<SensorReading> {
Connection conn = null;
PreparedStatement insertStmt =null;
PreparedStatement updateStmt =null;
@Override
public void open(Configuration parameters) throws Exception {
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/***?serverTimezone=Asia/Shanghai","root","****");
insertStmt=conn.prepareStatement("insert into sensor_temp(id,temp) values(?,?)");
updateStmt=conn.prepareStatement("update sensor_temp set temp= ? where id = ?");
}
@Override
public void invoke(SensorReading value, Context context) throws Exception {
//直接执行更新语句
updateStmt.setDouble(1,value.getTemperature());
updateStmt.setString(2,value.getId());
updateStmt.execute();
//if failed
if(updateStmt.getUpdateCount() == 0){
insertStmt.setDouble(2,value.getTemperature());
insertStmt.setString(1,value.getId());
insertStmt.execute();
}
}
@Override
public void close() throws Exception {
insertStmt.close();
updateStmt.close();
conn.close();
}
}
answer: