文章目录
flink中动态表的时间特性
一、processTime
1)DataStream转化成Table时指定
//1.获取执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);
//获取TableAPI执行环境
StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);
2)定义Table Schema时指定
//1.获取执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
env.setStreamTimeCharacteristic(TimeCharacteristic.ProcessingTime);
//获取TableAPI执行环境
StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);
拿kafka为例,在Schema里面创建一个字段。
//2.创建Kafka的连接器
tableEnv.connect(new Kafka()
.version("0.11") //kafka的版本号。
.topic("test") //哪个主题作为数据源。
.property(ConsumerConfig.BOOTSTRAP_SERVERS_CONFIG, "hadoop102:9092") //服务器的信息
.property(ConsumerConfig.GROUP_ID_CONFIG, "BigData")) //消费者组,随便起的。
.withFormat(new Json())
.withSchema(new Schema()
.field("xxx", DataTypes.STRING())
.... //其他的字段
.field("pt", DataTypes.TIMESTAMP(3)).proctime())//加了一个新的字段,3是精度。
.createTemporaryTable("kafkaSource"); //创建临时表
二、EventTime
1)DataStream转化成Table时指定
事件时间必须申明时间语义!!!
//1.获取执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
//既然用的是事件时间,就要申明时间语义。
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
//获取TableAPI执行环境
StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);
获取数据源(用端口进行举例)
//2.读取端口数据转换为JavaBean
//在转换为JavaBean类型之后,紧接着用assignTimestampsAndWatermarks方法提取时间戳。
SingleOutputStreamOperator<SensorReading> sensorDS = env.socketTextStream("hadoop102", 9999)
.map(line -> {
String[] fields = line.split(",");
return new SensorReading(fields[0],
Long.parseLong(fields[1]),
Double.parseDouble(fields[2]));
})
//提取时间戳,就是事件时间的时间戳,作为watermark。
.assignTimestampsAndWatermarks(new BoundedOutOfOrdernessTimestampExtractor<SensorReading>(Time.seconds(2)) {
@Override
public long extractTimestamp(SensorReading element) {
return element.getTs() * 1000L;
}
});
流转换为表,并且指定时间字段。
//3.将流转换为表,并指定处理时间字段
//rt.rowtime中rowtime前面那个rt随便写,后面的rowtime是规定的。
Table table = tableEnv.fromDataStream(sensorDS, "id,ts,temp,rt.rowtime");
大体过程就是这个样子。
2)定义Table Schema时指定
//1.创建执行环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
env.setParallelism(1);
env.setStreamTimeCharacteristic(TimeCharacteristic.EventTime);
//获取TableAPI执行环境
StreamTableEnvironment tableEnv = StreamTableEnvironment.create(env);
构建文件的连接器,在连接器里面指定事件时间。
//2.构建文件的连接器
//在连接器里面指定事件时间。
tableEnv.connect(new FileSystem().path("sensor"))
.withFormat(new OldCsv())
.withSchema(new Schema()
...... //其他字段。
.field("ts", DataTypes.BIGINT())
.rowtime(new Rowtime()
.timestampsFromField("ts") // 从字段中提取时间戳
.watermarksPeriodicBounded(1000) // watermark延迟1秒
)
...... //其他字段。
.createTemporaryTable("sourceTable");
最后,env.execute();