Commit a6c61816 by 吴延飞

修改旅行信息实时计算任务的写入逻辑,改为写入到Doris数据库

parent 153adf3d
...@@ -32,8 +32,8 @@ public class Travel { ...@@ -32,8 +32,8 @@ public class Travel {
// 旅行结束时间 // 旅行结束时间
private String travelEndTime; private String travelEndTime;
// 旅行时长= 旅行结束 - 旅行开始 (毫秒) // 流向
private long travelDuration; private String flowDirection;
// 车辆ID // 车辆ID
private Long carId; private Long carId;
...@@ -51,7 +51,7 @@ public class Travel { ...@@ -51,7 +51,7 @@ public class Travel {
private String carType; private String carType;
// 捕获车道ID // 捕获车道ID
private String firstLineId; private String firstLaneId;
// 捕获时速度 // 捕获时速度
private Double firstSpeed; private Double firstSpeed;
...@@ -60,7 +60,7 @@ public class Travel { ...@@ -60,7 +60,7 @@ public class Travel {
private String firstTime; private String firstTime;
// 达到车道ID // 达到车道ID
private String arrivedLineId; private String arrivedLaneId;
// 到达时速度 // 到达时速度
private Double arrivedSpeed; private Double arrivedSpeed;
...@@ -69,7 +69,7 @@ public class Travel { ...@@ -69,7 +69,7 @@ public class Travel {
private String arrivedTime; private String arrivedTime;
// 进入车道ID // 进入车道ID
private String inCrossLineId; private String inCrossLaneId;
// 进入时速度 // 进入时速度
private Double inSpeed; private Double inSpeed;
...@@ -78,7 +78,7 @@ public class Travel { ...@@ -78,7 +78,7 @@ public class Travel {
private String inCrossTime; private String inCrossTime;
// 通过车道ID // 通过车道ID
private String outCrossLineId; private String outCrossLaneId;
// 通过时速度 // 通过时速度
private Double outSpeed; private Double outSpeed;
...@@ -87,7 +87,7 @@ public class Travel { ...@@ -87,7 +87,7 @@ public class Travel {
private String outCrossTime; private String outCrossTime;
// 驶离车道ID // 驶离车道ID
private String awayLineId; private String awayLaneId;
// 驶离时速度 // 驶离时速度
private Double awaySpeed; private Double awaySpeed;
...@@ -96,7 +96,7 @@ public class Travel { ...@@ -96,7 +96,7 @@ public class Travel {
private String awayTime; private String awayTime;
// 丢失车道ID // 丢失车道ID
private String lastLineId; private String lastLaneId;
// 丢失时速度 // 丢失时速度
private Double lastSpeed; private Double lastSpeed;
...@@ -105,7 +105,7 @@ public class Travel { ...@@ -105,7 +105,7 @@ public class Travel {
private String lastTime; private String lastTime;
// 旅行时长,驶离时刻 - 到达时刻, 单位秒 // 旅行时长,驶离时刻 - 到达时刻, 单位秒
private int crossingTime; private double crossingTime;
// 旅行时点位集合 // 旅行时点位集合
private List<Location> locations; private List<Location> locations;
...@@ -216,12 +216,12 @@ public class Travel { ...@@ -216,12 +216,12 @@ public class Travel {
this.carType = carType; this.carType = carType;
} }
public String getFirstLineId() { public String getFirstLaneId() {
return firstLineId; return firstLaneId;
} }
public void setFirstLineId(String firstLineId) { public void setFirstLaneId(String firstLaneId) {
this.firstLineId = firstLineId; this.firstLaneId = firstLaneId;
} }
public Double getFirstSpeed() { public Double getFirstSpeed() {
...@@ -240,12 +240,12 @@ public class Travel { ...@@ -240,12 +240,12 @@ public class Travel {
this.firstTime = firstTime; this.firstTime = firstTime;
} }
public String getArrivedLineId() { public String getArrivedLaneId() {
return arrivedLineId; return arrivedLaneId;
} }
public void setArrivedLineId(String arrivedLineId) { public void setArrivedLaneId(String arrivedLaneId) {
this.arrivedLineId = arrivedLineId; this.arrivedLaneId = arrivedLaneId;
} }
public Double getArrivedSpeed() { public Double getArrivedSpeed() {
...@@ -264,12 +264,12 @@ public class Travel { ...@@ -264,12 +264,12 @@ public class Travel {
this.arrivedTime = arrivedTime; this.arrivedTime = arrivedTime;
} }
public String getInCrossLineId() { public String getInCrossLaneId() {
return inCrossLineId; return inCrossLaneId;
} }
public void setInCrossLineId(String inCrossLineId) { public void setInCrossLaneId(String inCrossLaneId) {
this.inCrossLineId = inCrossLineId; this.inCrossLaneId = inCrossLaneId;
} }
public Double getInSpeed() { public Double getInSpeed() {
...@@ -288,12 +288,12 @@ public class Travel { ...@@ -288,12 +288,12 @@ public class Travel {
this.inCrossTime = inCrossTime; this.inCrossTime = inCrossTime;
} }
public String getOutCrossLineId() { public String getOutCrossLaneId() {
return outCrossLineId; return outCrossLaneId;
} }
public void setOutCrossLineId(String outCrossLineId) { public void setOutCrossLaneId(String outCrossLaneId) {
this.outCrossLineId = outCrossLineId; this.outCrossLaneId = outCrossLaneId;
} }
public Double getOutSpeed() { public Double getOutSpeed() {
...@@ -312,12 +312,12 @@ public class Travel { ...@@ -312,12 +312,12 @@ public class Travel {
this.outCrossTime = outCrossTime; this.outCrossTime = outCrossTime;
} }
public String getAwayLineId() { public String getAwayLaneId() {
return awayLineId; return awayLaneId;
} }
public void setAwayLineId(String awayLineId) { public void setAwayLaneId(String awayLaneId) {
this.awayLineId = awayLineId; this.awayLaneId = awayLaneId;
} }
public Double getAwaySpeed() { public Double getAwaySpeed() {
...@@ -336,12 +336,12 @@ public class Travel { ...@@ -336,12 +336,12 @@ public class Travel {
this.awayTime = awayTime; this.awayTime = awayTime;
} }
public String getLastLineId() { public String getLastLaneId() {
return lastLineId; return lastLaneId;
} }
public void setLastLineId(String lastLineId) { public void setLastLaneId(String lastLaneId) {
this.lastLineId = lastLineId; this.lastLaneId = lastLaneId;
} }
public Double getLastSpeed() { public Double getLastSpeed() {
...@@ -360,11 +360,11 @@ public class Travel { ...@@ -360,11 +360,11 @@ public class Travel {
this.lastTime = lastTime; this.lastTime = lastTime;
} }
public int getCrossingTime() { public double getCrossingTime() {
return crossingTime; return crossingTime;
} }
public void setCrossingTime(int crossingTime) { public void setCrossingTime(double crossingTime) {
this.crossingTime = crossingTime; this.crossingTime = crossingTime;
} }
...@@ -424,12 +424,12 @@ public class Travel { ...@@ -424,12 +424,12 @@ public class Travel {
this.maxSpeed = maxSpeed; this.maxSpeed = maxSpeed;
} }
public long getTravelDuration() { public String getFlowDirection() {
return travelDuration; return flowDirection;
} }
public void setTravelDuration(long travelDuration) { public void setFlowDirection(String flowDirection) {
this.travelDuration = travelDuration; this.flowDirection = flowDirection;
} }
@Override @Override
...@@ -441,32 +441,31 @@ public class Travel { ...@@ -441,32 +441,31 @@ public class Travel {
", recordTime='" + recordTime + '\'' + ", recordTime='" + recordTime + '\'' +
", travelBeginTime='" + travelBeginTime + '\'' + ", travelBeginTime='" + travelBeginTime + '\'' +
", travelEndTime='" + travelEndTime + '\'' + ", travelEndTime='" + travelEndTime + '\'' +
", travelDuration='" + travelDuration + '\'' + ", flowDirection='" + flowDirection + '\'' +
", carId=" + carId + ", carId=" + carId +
", carColor='" + carColor + '\'' + ", carColor='" + carColor + '\'' +
", plate='" + plate + '\'' + ", plate='" + plate + '\'' +
", plateColor='" + plateColor + '\'' + ", plateColor='" + plateColor + '\'' +
", carType='" + carType + '\'' + ", carType='" + carType + '\'' +
", firstLineId='" + firstLineId + '\'' + ", firstLaneId='" + firstLaneId + '\'' +
", firstSpeed=" + firstSpeed + ", firstSpeed=" + firstSpeed +
", firstTime='" + firstTime + '\'' + ", firstTime='" + firstTime + '\'' +
", arrivedLineId='" + arrivedLineId + '\'' + ", arrivedLaneId='" + arrivedLaneId + '\'' +
", arrivedSpeed=" + arrivedSpeed + ", arrivedSpeed=" + arrivedSpeed +
", arrivedTime='" + arrivedTime + '\'' + ", arrivedTime='" + arrivedTime + '\'' +
", inCrossLineId='" + inCrossLineId + '\'' + ", inCrossLaneId='" + inCrossLaneId + '\'' +
", inSpeed=" + inSpeed + ", inSpeed=" + inSpeed +
", inCrossTime='" + inCrossTime + '\'' + ", inCrossTime='" + inCrossTime + '\'' +
", outCrossLineId='" + outCrossLineId + '\'' + ", outCrossLaneId='" + outCrossLaneId + '\'' +
", outSpeed=" + outSpeed + ", outSpeed=" + outSpeed +
", outCrossTime='" + outCrossTime + '\'' + ", outCrossTime='" + outCrossTime + '\'' +
", awayLineId='" + awayLineId + '\'' + ", awayLaneId='" + awayLaneId + '\'' +
", awaySpeed=" + awaySpeed + ", awaySpeed=" + awaySpeed +
", awayTime='" + awayTime + '\'' + ", awayTime='" + awayTime + '\'' +
", lastLineId='" + lastLineId + '\'' + ", lastLaneId='" + lastLaneId + '\'' +
", lastSpeed=" + lastSpeed + ", lastSpeed=" + lastSpeed +
", lastTime='" + lastTime + '\'' + ", lastTime='" + lastTime + '\'' +
", crossingTime=" + crossingTime + ", crossingTime=" + crossingTime +
", locations=" + locations +
", remark='" + remark + '\'' + ", remark='" + remark + '\'' +
", stopCount=" + stopCount + ", stopCount=" + stopCount +
", stopTime=" + stopTime + ", stopTime=" + stopTime +
......
...@@ -31,7 +31,7 @@ public class TravelInfoJob { ...@@ -31,7 +31,7 @@ public class TravelInfoJob {
// 通过kafka配置文件,获取String类型的实时数据流 // 通过kafka配置文件,获取String类型的实时数据流
DataStream<String> rawStringStream = FlinkUtils.createKafkaStream(args, env); DataStream<String> rawStringStream = FlinkUtils.createKafkaStream(args, env);
// DataStream<String> rawStringStream = env.readTextFile("./data/2022-11-23--11/.part-820a21c1-f4fa-485e-a3ed-b65e15fefdfa-0.inprogress.59c1cbee-8597-4dd7-a2fc-12c8df8db83d");
// 接入数据的第一时间,要进行本地文件备份,以便后续问题排查 // 接入数据的第一时间,要进行本地文件备份,以便后续问题排查
rawStringStream.sinkTo(FileUtils.getFileSink("./data/")); rawStringStream.sinkTo(FileUtils.getFileSink("./data/"));
...@@ -46,15 +46,11 @@ public class TravelInfoJob { ...@@ -46,15 +46,11 @@ public class TravelInfoJob {
String travelStart = travel.getTravelBeginTime(); String travelStart = travel.getTravelBeginTime();
String travelEnd = travel.getTravelEndTime(); String travelEnd = travel.getTravelEndTime();
long duration = -1L;
// 如果旅行记录没有完整的开始、结束时刻,则无法计算最高、最低、平均速度 // 如果旅行记录没有完整的开始、结束时刻,则无法计算最高、最低、平均速度
if(isNotEmpty(travelStart) && isNotEmpty(travelEnd)) { if(isNotEmpty(travelStart) && isNotEmpty(travelEnd)) {
long longTravelStart = Long.parseLong(travelStart); long longTravelStart = Long.parseLong(travelStart);
long longTravelEnd = Long.parseLong(travelEnd); long longTravelEnd = Long.parseLong(travelEnd);
duration = longTravelEnd - longTravelStart;
List<Location> locations = travel.getLocations(); List<Location> locations = travel.getLocations();
for (int i = 0; i < locations.size(); i++) { for (int i = 0; i < locations.size(); i++) {
...@@ -121,7 +117,6 @@ public class TravelInfoJob { ...@@ -121,7 +117,6 @@ public class TravelInfoJob {
} }
travel.setMaxSpeed(maxSpeed); travel.setMaxSpeed(maxSpeed);
travel.setMinSpeed(minSpeed); travel.setMinSpeed(minSpeed);
travel.setTravelDuration(duration);
logger.info("完成旅行信息的指标计算,当前旅行车辆旅行ID{}的实时指标为, 最高速度:{}, 最低速度:{}, 平均速度:{}, 停车次数: {}," + logger.info("完成旅行信息的指标计算,当前旅行车辆旅行ID{}的实时指标为, 最高速度:{}, 最低速度:{}, 平均速度:{}, 停车次数: {}," +
"停车总时长:{}", travel.getRecordId(), maxSpeed, minSpeed, travel.getAvgSpeed(), stopCount, stopTime); "停车总时长:{}", travel.getRecordId(), maxSpeed, minSpeed, travel.getAvgSpeed(), stopCount, stopTime);
......
package com.zhht.irn.sink; package com.zhht.irn.sink;
import com.zhht.irn.entity.Travel; import com.zhht.irn.entity.Travel;
import com.zhht.irn.utils.DateUtils; import com.zhht.irn.utils.DorisUtils;
import com.zhht.irn.utils.MySQLUtils;
import org.apache.flink.configuration.Configuration; import org.apache.flink.configuration.Configuration;
import org.apache.flink.streaming.api.functions.sink.RichSinkFunction; import org.apache.flink.streaming.api.functions.sink.RichSinkFunction;
import java.sql.Connection; import java.sql.Connection;
import java.sql.Date;
import java.sql.PreparedStatement; import java.sql.PreparedStatement;
import static com.zhht.irn.utils.DateUtils.longToString; import static com.zhht.irn.utils.DateUtils.longToString;
...@@ -22,15 +23,16 @@ public class TravelMetricSink extends RichSinkFunction<Travel> { ...@@ -22,15 +23,16 @@ public class TravelMetricSink extends RichSinkFunction<Travel> {
@Override @Override
public void open(Configuration parameters) throws Exception { public void open(Configuration parameters) throws Exception {
super.open(parameters); super.open(parameters);
connection = MySQLUtils.getConnection(); connection = DorisUtils.getConnection();
//目前值考虑插入,不考虑更新 //目前值考虑插入,不考虑更新
String insertSql="" + String insertSql="" +
"insert into app_travel_metric" + "insert into app_travel_metric" +
"(incross_line_id, car_id, cross_id, plate, record_id, capture_time, lost_time, arrived_time, incross_time, " + "(record_id, cross_id, record_time, travel_begin_time, travel_end_time, flow_direction, car_id, car_color, plate, plate_color, car_type, " +
"outcross_time, away_time, stop_count, stop_time, avg_speed, min_speed, max_speed, update_time, travel_begin_time," + "first_lane_id, first_time, first_speed, arrived_lane_id, arrived_time, arrived_speed, incross_lane_id, incross_time, incross_speed, " +
" travel_end_time, arrived_line_id, outcross_line_id, away_line_id, duration)" + "outcross_lane_id, outcross_time, outcross_speed, away_lane_id, away_time, away_speed, last_lane_id, last_time, last_speed, duration, min_speed, " +
"values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; "max_speed, avg_speed, stop_count, stop_time, statistic_time)" +
"values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
insertPstmt = connection.prepareStatement(insertSql); insertPstmt = connection.prepareStatement(insertSql);
} }
@Override @Override
...@@ -43,29 +45,49 @@ public class TravelMetricSink extends RichSinkFunction<Travel> { ...@@ -43,29 +45,49 @@ public class TravelMetricSink extends RichSinkFunction<Travel> {
@Override @Override
public void invoke(Travel travel, Context context) throws Exception { public void invoke(Travel travel, Context context) throws Exception {
System.out.println("=====insert travel ======" + travel); System.out.println("=====insert travel ======" + travel);
insertPstmt.setString(1, travel.getInCrossLineId()); insertPstmt.setString(1, travel.getRecordId());
insertPstmt.setLong(2, travel.getCarId()); insertPstmt.setString(2, travel.getCrossId());
insertPstmt.setString(3, travel.getCrossId()); insertPstmt.setDate(3, new Date(Long.parseLong(travel.getRecordTime())));
insertPstmt.setString(4, travel.getPlate()); insertPstmt.setString(4, longToString(travel.getTravelBeginTime(), timeFormat));
insertPstmt.setString(5, travel.getRecordId()); insertPstmt.setString(5, longToString(travel.getTravelEndTime(), timeFormat));
insertPstmt.setString(6, longToString(travel.getFirstTime(), timeFormat)); insertPstmt.setString(6, travel.getFlowDirection());
insertPstmt.setString(7, longToString(travel.getLastTime(), timeFormat)); insertPstmt.setLong(7, travel.getCarId());
insertPstmt.setString(8, longToString(travel.getArrivedTime(), timeFormat)); insertPstmt.setString(8, travel.getCarColor());
insertPstmt.setString(9, longToString(travel.getInCrossTime(), timeFormat)); insertPstmt.setString(9, travel.getPlate());
insertPstmt.setString(10, longToString(travel.getOutCrossTime(), timeFormat)); insertPstmt.setString(10, travel.getPlateColor());
insertPstmt.setString(11, longToString(travel.getAwayTime(), timeFormat)); insertPstmt.setString(11, travel.getCarType());
insertPstmt.setInt(12, travel.getStopCount());
insertPstmt.setDouble(13, travel.getStopTime()); insertPstmt.setString(12, travel.getFirstLaneId());
insertPstmt.setDouble(14, travel.getAvgSpeed()); insertPstmt.setString(13, longToString(travel.getFirstTime(), timeFormat));
insertPstmt.setDouble(15, travel.getMinSpeed()); insertPstmt.setDouble(14, travel.getFirstSpeed());
insertPstmt.setDouble(16, travel.getMaxSpeed());
insertPstmt.setString(17, DateUtils.getTodayTime()); insertPstmt.setString(15, travel.getArrivedLaneId());
insertPstmt.setString(18, longToString(travel.getTravelBeginTime(), timeFormat)); insertPstmt.setString(16, longToString(travel.getArrivedTime(), timeFormat));
insertPstmt.setString(19, longToString(travel.getTravelEndTime(), timeFormat)); insertPstmt.setDouble(17, travel.getArrivedSpeed());
insertPstmt.setString(20, travel.getArrivedLineId());
insertPstmt.setString(21, travel.getOutCrossLineId()); insertPstmt.setString(18, travel.getInCrossLaneId());
insertPstmt.setString(22, travel.getAwayLineId()); insertPstmt.setString(19, longToString(travel.getInCrossTime(), timeFormat));
insertPstmt.setLong(23, travel.getTravelDuration()); insertPstmt.setDouble(20, travel.getInSpeed());
insertPstmt.setString(21, travel.getOutCrossLaneId());
insertPstmt.setString(22, longToString(travel.getOutCrossTime(), timeFormat));
insertPstmt.setDouble(23, travel.getOutSpeed());
insertPstmt.setString(24, travel.getAwayLaneId());
insertPstmt.setString(25, longToString(travel.getAwayTime(), timeFormat));
insertPstmt.setDouble(26, travel.getAwaySpeed());
insertPstmt.setString(27, travel.getLastLaneId());
insertPstmt.setString(28, longToString(travel.getLastTime(), timeFormat));
insertPstmt.setDouble(29, travel.getLastSpeed());
insertPstmt.setDouble(30, travel.getCrossingTime());
insertPstmt.setDouble(31, travel.getMinSpeed());
insertPstmt.setDouble(32, travel.getMaxSpeed());
insertPstmt.setDouble(33, travel.getAvgSpeed());
insertPstmt.setInt(34, travel.getStopCount());
insertPstmt.setDouble(35, travel.getStopTime());
insertPstmt.setString(36, longToString(System.currentTimeMillis(), timeFormat));
insertPstmt.execute(); insertPstmt.execute();
} }
......
package com.zhht.irn.utils;
import org.apache.flink.api.java.utils.ParameterTool;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class DorisUtils {
public static Connection getConnection() throws Exception {
String propertyPath = ".\\realtime\\hologram-streaming\\src\\main\\resources\\doris.properties";
return getConnection(propertyPath);
}
public static Connection getConnection(String propertyPath) throws Exception {
ParameterTool tool = ParameterTool.fromPropertiesFile(propertyPath);
// 根据路径的配置文件获取MySQL链接参数
String driver = tool.getRequired("driver");
String username = tool.getRequired("username");
String password = tool.getRequired("password");
String host = tool.getRequired("host");
String port = tool.getRequired("port");
String database = tool.get("database", "default");
String jdbcUrl = String.format("jdbc:mysql://%s:%s/%s", host, port, database);
Class.forName(driver);
return DriverManager.getConnection(jdbcUrl, username, password);
}
public static void close(Connection connection, PreparedStatement pstmt) {
if(null != pstmt) {
try {
pstmt.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if(null != connection) {
try {
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment