目录
(1)时间属性
- 处理时间 指的是执行具体操作时的机器时间
- 事件时间 指的是数据本身携带的时间。这个时间是在事件产生时的时间。
时间属性可以是每个表模式的一部分。当通过CREATETABLE DDL或创建表格时定义。一旦定义了时间属性,就可以将其引用为字段并在基于时间的操作中使用。只要时间属性没有被修改,并且只是从查询的一部分转发到另一部分,它仍然是有效的时间属性。时间属性的行为类似于常规时间戳,可用于计算
(2)ProcessTime
- 在创建表的 DDL 中定义
- 在 DataStream 到 Table 转换时定义
- 使用 TableSource 定义(Flink1.12中不建议使用)
(2.1)在创建表的 DDL 中定义
- 处理时间属性可以在创建表的 DDL 中用计算列的方式定义,用 PROCTIME() 就可以定义处理时间。
- 处理时间是基于机器的本地时间来处理数据,它既不需要从数据里获取时间,也不需要生成watermark。
CREATE TABLE user_actions (
user_name STRING,
data STRING,
user_action_time AS PROCTIME() -- 声明一个额外的列作为处理时间属性
) WITH (
...
);
SELECT TUMBLE_START(user_action_time, INTERVAL '10' MINUTE), COUNT(DISTINCT user_name)
FROM user_actions
GROUP BY TUMBLE(user_action_time, INTERVAL '10' MINUTE);
数据源:
100,技术部
200,市场部
300,营销部
400,采购部
代码演示:
package com.aikfk.flink.sql;
import org.apache.flink.api.java.tuple.Tuple2;
import org.apache.flink.streaming.api.datastream.DataStream;
import org.apache.flink.streaming.api.environment.StreamExecutionEnvironment;
import org.apache.flink.table.api.EnvironmentSettings;
import org.apache.flink.table.api.Table;
import org.apache.flink.table.api.bridge.java.StreamTableEnvironment;
import org.apache.flink.types.Row;
/**
* @author :caizhengjie
* @description:TODO
* @date :2021/4/5 10:32 下午
*/
public class ProcessTimeSQL {
public static void main(String[] args) throws Exception {
// 1.准备环境
StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment();
// 2.创建TableEnvironment(Blink planner)
EnvironmentSettings settings = EnvironmentSettings.newInstance().inStreamingMode().useBlinkPlanner().build();
StreamTableEnvironment tableEnvironment = StreamTableEnvironment.create(env , settings);
// 3.文件path
String filePath = "/Users/caizhengjie/IdeaProjects/aikfk_flink/src/main/java/resources/dept.csv";
// 4.DDL-- 声明一个额外的列作为处理时间属性
String ddl = "create table dept (\n" +
" dept_id STRING,\n" +
" dept_name STRING,\n" +
" user_action_time AS PROCTIME()\n" +
") WITH (\n" +
" 'connector.type' = 'filesystem',\n" +
" 'connector.path' = '"+filePath+"',\n" +
" 'format.type' = 'csv'\n" +
")";
// 5.创建一个带processtime字段的表
tableEnvironment.executeSql(ddl);